我需要从db中选择随机记录。在我用于开发的Sqlite3中,有一个名为Random()的函数。但是,在Postgresql中它被称为Rand()。我不记得有关MySql的信息,但可能会在那里调用它。
所以,如果我有一个代码(对于Sqlite3)
data = Items.where(pubshied: is_pubshied).order("RANDOM()").limit(count)
如何确保它可以与不同的数据库一起使用?
答案 0 :(得分:4)
Rails不支持开箱即用。我相信我通过模型扩展实现了这一点(我不再使用它,因为我强制使用Postgresql),但这样的东西可以工作:
module Randomize
extend ActiveSupport::Concern
included do
scope :random, -> { order(rand_cmd) }
end
module ClassMethods
def rand_cmd
if connection.adapter_name =~ /mysql/i
'rand()'
else
'random()'
end
end
end
end
然后你可以做
class Item
include Randomize
end
Item.where(...).random.limit(...)
答案 1 :(得分:0)
对于高性能,非特定于适配器的随机排序方式,填充随机列,在其上放置索引并将其称为:
Foo.order("random_column > #{rand}").limit(1)
答案 2 :(得分:-1)
来自waldyr.ar在其评论中提到的帖子的评论:https://stackoverflow.com/a/12038506/16784。
Tl;博士:您可以使用Items.all.sample(count)
。当然,它会检索整个表,对大型表可能没用。