如果您的范围很简单,您可能希望避免代码重复。我的解决方案允许您调用model.active?
以了解实例是否属于范围,并Model.active
查找与范围匹配的所有记录。model.active?
不涉及任何数据库查询。
考虑将其添加到config/initializers/scope_and_method.rb
:
require 'active_record/named_scope'
module ActiveRecord::NamedScope::ClassMethods
def scope_and_method field, *values
field = field.to_sym
values.each do |value|
named_scope value.to_sym, :conditions => {field => value}
define_method "#{value}?" do
send(field.to_sym) == value
end
end
end
end
用法:
scope_and_method :state, 'active', 'inactive'
就好像它是:
named_scope :active, :conditions => {:state => 'active'}
named_scope :inactive, :conditions => {:state => 'inactive'}
def active?
state == 'active'
end
def inactive?
state == 'inactive'
end
这是 Rails 2.3 的解决方案。这需要对 Rails 3 和 4 进行非常小的调整。( named_scope
-> scope
) 我会尽快检查。