我需要从 db 中选择随机记录。在我在开发中使用的 Sqlite3 中,有一个名为 Random() 的函数。然而,在 Postgresql 中它被称为 Rand()。我不记得MySql,但可能在那里这样称呼它。
所以如果我有一个代码(对于 Sqlite3)
data = Items.where(pubshied: is_pubshied).order("RANDOM()").limit(count)
如何确保它适用于不同的数据库?
我需要从 db 中选择随机记录。在我在开发中使用的 Sqlite3 中,有一个名为 Random() 的函数。然而,在 Postgresql 中它被称为 Rand()。我不记得MySql,但可能在那里这样称呼它。
所以如果我有一个代码(对于 Sqlite3)
data = Items.where(pubshied: is_pubshied).order("RANDOM()").limit(count)
如何确保它适用于不同的数据库?
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(...)
对于一种高性能的、非适配器特定的随机排序方式,填充一个随机列,在其上放置一个索引并将其命名为:
Foo.order("random_column > #{rand}").limit(1)
从 waldyr.ar 在他的评论中提到的帖子的评论中:https ://stackoverflow.com/a/12038506/16784 。
Tl;博士:您可以使用Items.all.sample(count)
. 当然,这会检索整个表,对于大表可能没有用。