2017-08-10 55 views
1

我试图选择一个随机轨道,但希望它避免匹配特定的记录。防止在Rails中缓存随机SQL查询

这是我的代码,但它一直返回查询的CACHE,以便while循环永远不会结束。

current_track = Track.find(10) 
random_track = Track.limit(1).order("RANDOM()").first 

while random_track == current_track 
    random_track = Track.limit(1).order("RANDOM()").first 
    Rails.logger.debug "getting another random one..." random_track 
end 

防止这种情况的最佳方法是什么?

回答

3

这很奇怪,它不会在我身上发生。无论如何,你可以使用uncached

Track.uncached { Track.order("RANDOM()").first } 

请注意,您不需要limit(1)作为first已经发生的单个项目。

你也不需要那个循环。采取不同的轨道使用

current_track = Track.find(10) 
random_track = Track.where("id <> ?", current_track.id).order("RANDOM()").first 

您将节省一堆不必要的代码。

+0

我建议不要使用'uncached',因为没有理由使用它。别的东西坏了。 –

+0

谢谢!这工作完美,尽管知道uncached的语法是很好的,我完全同意最好使用where查询! – Chris

1

这适用于我。你有没有默认的范围或缓存运行?

您可以通过从随机查询中排除current_track来避免循环。如果只有一个轨道,您的解决方案也将失败,因为循环永远不会结束。

current_track = Track.find(3) 
random_track = Track.where.not(id: current_track).order("RANDOM()").first 

请注意,如果您的表增长,RANDOM()订单可能会变得非常昂贵。

+0

对不起,我错过了您的帖子Pascal,感谢您花时间向我解释。我已经将Simone的答案标记为正确,因此只能赞成这一点。 – Chris

+0

感谢您的反馈@chris!答案是一样的,只要确保你总是至少有两首曲目.... –