我是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。 通用标签

由于使用类方法,因此代码在方法调用时运行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top