随机选择RoR中的不同数据库

时间:2012-12-20 12:38:55

标签: ruby-on-rails ruby activerecord

我需要从db中选择随机记录。在我用于开发的Sqlite3中,有一个名为Random()的函数。但是,在Postgresql中它被称为Rand()。我不记得有关MySql的信息,但可能会在那里调用它。

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

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

如何确保它可以与不同的数据库一起使用?

3 个答案:

答案 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)。当然,它会检索整个表,对大型表可能没用。