ActiveRecord Rails 3范围与类方法
-
29-10-2019 - |
题
我是ActiveRecord的新查询界面的新手,所以我仍然在解决问题。
我希望有人能解释一下在ActiveRecord模型中使用scope
和仅使用类方法(即self.some_method
)之间的区别
据我所知,总是希望范围返回一个关系,而类方法不一定必须返回。这是真的吗?
例如,我认为做这样的事情很有意义: 通用标签
但这不起作用。我收到此错误: 通用标签
但是它确实可以作为类方法 通用标签
我很想知道人们对于何时使用范围以及何时使用类方法的想法。我假设范围必须总是返回一个关系,但是一个类方法可以返回它想要的任何东西,我是否正确?
解决方案
在Rails 2.x中有更多的不同,因为named_scopes不会执行查询(因此您可以链接它们),而类方法通常会执行查询(因此您不能链接它们),除非您手动进行将您的查询包装在scoped(...)
调用中。
在Rails 3中,所有东西都返回一个ActiveRecord::Relation
代码,直到需要实际结果为止,因此可以将范围与类方法链接起来,反之亦然(只要该类方法返回ActiveRecord::Relation
对象,而不是其他某种对象类型(如count)))。
通常,我将scope
条目用于简单的一列式来过滤我的结果集。但是,如果我在“范围”内做任何复杂的事情,可能需要详细的逻辑,lambda,多行等,则我更喜欢使用类方法。正如您所了解的,如果我需要返回计数或类似的东西,我会使用类方法。
其他提示
正如他在回答中提到的 Dylan 一样,作用域和类方法之间的区别是作用域在该类已加载。这可能会导致意外结果。
例如, 通用标签
容易出错。正确的方法是使用lambda 通用标签
Lambda块被延迟计算。所以Date.today是在调用范围时运行的,而不是 在评估课程时。
如果使用类方法,则无需使用lambda。 通用标签
由于使用类方法,因此代码在方法调用时运行。