您好如何构建一个对所有模型都通用的named_scope。
答案 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)