在Rails中添加可用于所有activerecord模型的全局函数

时间:2013-02-28 21:00:14

标签: ruby-on-rails activerecord

嘿伙计们我想添加一个这样的函数,它会向我的Structure中存在的所有活动记录模型返回一个随机记录。我该怎么做呢?

  def self.random
   if (c = count) != 0
    find(:first, :offset =>rand(c))
   end
  end

3 个答案:

答案 0 :(得分:1)

为什么麻烦?

Model.order("RANDOM()").first

在这个问题上有更好的性能查询

Rails 3: Get Random Record

答案 1 :(得分:0)

即使你可以使用直接sql,我也会把它留在这里,以备将来有关向所有ActiveRecord个对象添加类方法的参考。

class MyActiveRecordBase < ActiveRecord::Base
  def self.random
    if (c = count) != 0
      find(:first, :offset =>rand(c))
    end
  end
end

现在确保您希望此类方法的每个模型都从MyActiveRecordBase

扩展
class Model < MyActiveRecordBase
end

class AnotherModel < MyActiveRecordBase
end

答案 2 :(得分:0)

在/ lib文件夹中创建一个模块,作为models_methods.rb。

在此模块中创建一个方法

def rand(model)

   model.order("RANDOM()").first

end

def string_to_url(model)

  model.find(2).name.gsub([^A-Za-z0-9],/ /).downcase)

end

在所有模型中包含此模块为“include ModelsMethods”。此模块可以包含您希望跨模型使用的所有方法。