2

我最近发现了范围(我 == Rails noob)。凉爽的。但是我发现命名范围已经死了。我想做对,所以我改变了这个:

 def Foo
    scope :only_some, where('some conditions')

为此(按照指示):

class << self

   def only_some
      where('some conditions')
   end

end

然后这停止工作:

bar.foos.only_some

例外:

undefined method `only_some' for #<ActiveRecord::Relation:0x007fb398d99178>

我究竟做错了什么?我应该继续使用范围吗?

4

1 回答 1

2

相反,在查询关联对象时,作用域优于类方法,原因有二:

  1. 范围简化了复杂查询的生成。将作用域视为“惰性”序列,仅在调用者需要该值时(即最后)才被评估。因此,您可以通过链接作用域方法来构造复杂的查询,而不必担心多个 SQL 查询会影响性能。您也可以在类方法中这样做,但灵活性较差。您必须在这些类方法中使用“作用域”方法来作用于当前作用域。

  2. 您可以在关联对象的集合以及单个对象上调用范围方法。这是因为 ActiveRecord 关联是 ActiveRecord::Relation 类的实例,可以在其上调用范围方法,而类方法则不然。而这正是您面临的问题。在您的示例中,当您将“only_some”定义为范围方法时,ActiveRecord 将在 ActiveRecord::Relation 对象上调用“only_some”,该对象反过来将在每个 foo 上调用该方法。但是当你把它重新定义为一个类方法时,你只能在模型类 Foo 上调用这个方法。

于 2012-04-27T04:28:57.780 回答