named_scope 或 scope 与类方法有何区别。
named_scope :active, :conditions => {:status => 'Active'}
def self.active
self.find(:all, :conditions => {:status => 'Active'}
end
两者有什么区别?
named_scope 或 scope 与类方法有何区别。
named_scope :active, :conditions => {:status => 'Active'}
def self.active
self.find(:all, :conditions => {:status => 'Active'}
end
两者有什么区别?
最后,“范围”将在您的模型上定义一个可链接的类方法。这就是为什么每个返回“范围”(ActiveRecord::Relation 类的对象)的类方法都可以以与定义的范围/命名范围相同的方式使用。
如果您想了解有关范围的更多信息,我建议您使用 rails 控制台来玩一些输出,或者 - 也许作为开始 - 阅读 rails 指南 - 他们几乎解释了它:http://guides.rubyonrails。 org/active_record_querying.html#scopes
编辑:
哦,当然,阅读 Rails 代码通常可以更快地解决问题,然后是任何人或其他任何事情。如果您在此处查看“范围”方法的定义:https ://github.com/rails/rails/blob/master/activerecord/lib/active_record/scoping/named.rb#L159您将看到它是如何定义的一个方法(在类级别) - 这与您自己定义方法非常相似,如您的示例中所示。
最大的区别是可链接性。假设您有另一个命名范围,流行:
named_scope :popular, :conditions => { :popular => true }
假设您想获得受欢迎的活跃用户。所以你说User.popular.active
named_scope :active, :conditions => {:status => 'Active'}
在这种情况下,然后User.popular.active
工作。
另一方面,
def self.active
self.find(:all, :conditions => {:status => 'Active'}
end
可能允许您说User.active.popular
(取决于您的 Rails 版本,IIRC),但绝对不是 User.popular.active
.
非正式地,该scope
方法安排它定义的方法在对象的其他范围内可用。定义一个类方法没有。