如何为所有ActiveRecord模型使用常见的named_scope

时间:2009-11-06 12:20:16

标签: ruby-on-rails ruby activerecord

您好如何构建一个对所有模型都通用的named_scope。

3 个答案:

答案 0 :(得分:8)

我将此代码放在lib/has_common_named_scopes.rb

module HasCommonNamedScopes
  def self.included(base)
    base.class_eval {
      # Named scopes
      named_scope :newest, :order => "#{base.table_name}.created_at DESC"
      named_scope :freshest, :order => "#{base.table_name}.updated_at DESC"
      named_scope :limit, lambda { |limit| {:limit => limit} }
    }
  end
end

然后在我需要的每个模型中包含模块:

class MyModel < ActiveRecord::Base
  include HasCommonNamedScopes

我建议您在引用这些命名范围中的列时使用base.table_name限定表,就像我在示例中所做的那样。否则,当您将这些命名范围与其他表中连接的其他范围组合时,会遇到模糊引用的问题。

<强>更新

scope用于Rails&gt; 3和named_scope在以前的版本中使用过。

答案 1 :(得分:1)

还有Thoughtbot's Pacecar,它为每个模型添加了一堆非常常见的命名范围。它可能伴随着您正在寻找的东西。但是,如果您需要自定义内容,Casper Fabricius有正确的想法。

答案 2 :(得分:0)

对于Rails4项目,我通过扩展ActiveRecord::Base(所有Rails模型继承的类,在初始化程序中(猴子修补方法,提防)

来实现此目的。
# in /config/initializers/shared_scope_initializer.rb
module SharedScopes
  extend ActiveSupport::Concern

  module ClassMethods
    def named_scope
      return where(attribute: value) # query here
    end
  end
end

ActiveRecord::Base.send(:include, SharedScopes)