检查模型实例是否属于rails中的named_scope

假设我有一个命名范围:

class Foo  'some_field = 1' end 

这适用于查询,我定义了一堆有用的named_scopes。 我想要的是能够做到这一点:

 f = Foo.find(:first) f.some_field = 1 f.is_bar? #=> true 

酒吧?’ 如果模型实例属于命名范围,则method将简单地返回true或false。 不管怎么说没有写’is_bar’吗? 即使我已经写了一个很好的方法来检查’is_bar’是否有问题? 如果我没记错的话,DRY很好,所以任何帮助都会非常感激/

你可以调用exists? 命名范围上的方法,它将查询数据库以查看给定记录是否存在这些条件。

 Foo.bar.exists?(f) 

但是,如果您更改了f上的属性而未将其保存到数据库,则此方法无效。 这是因为命名范围条件是SQL,因此必须在那里进行检查。 if条件混乱,尝试转换为Ruby,尤其是在更复杂的场景中。

如果您的范围很简单,您可能希望避免代码重复。 我的解决方案允许您调用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 )我会尽快检查它。