4

我需要从 db 中选择随机记录。在我在开发中使用的 Sqlite3 中,有一个名为 Random() 的函数。然而,在 Postgresql 中它被称为 Rand()。我不记得MySql,但可能在那里这样称呼它。

所以如果我有一个代码(对于 Sqlite3)

data = Items.where(pubshied: is_pubshied).order("RANDOM()").limit(count)

如何确保它适用于不同的数据库?

4

3 回答 3

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(...)
于 2012-12-20T12:46:27.003 回答
0

对于一种高性能的、非适配器特定的随机排序方式,填充一个随机列,在其上放置一个索引并将其命名为:

Foo.order("random_column > #{rand}").limit(1)
于 2012-12-20T14:06:46.087 回答
-1

从 waldyr.ar 在他的评论中提到的帖子的评论中:https ://stackoverflow.com/a/12038506/16784 。

Tl;博士:您可以使用Items.all.sample(count). 当然,这会检索整个表,对于大表可能没有用。

于 2012-12-20T13:24:34.653 回答