Ruby on rails 3 如果不使用命名作用域,则如何使用?

Ruby on rails 3 如果不使用命名作用域,则如何使用?,ruby-on-rails-3,activerecord,Ruby On Rails 3,Activerecord,我最近发现了作用域(me==railsnoob)。酷。但我发现了。我想把它做好,所以我改变了这个: def Foo scope :only_some, where('some conditions') 为此(按照指示): 例外情况: undefined method `only_some' for #<ActiveRecord::Relation:0x007fb398d99178> 未定义的方法'only_some'# 我做错了什么?我应该继续使用作用域吗?相反,在查

我最近发现了作用域(me==railsnoob)。酷。但我发现了。我想把它做好,所以我改变了这个:

 def Foo
    scope :only_some, where('some conditions')
为此(按照指示):

例外情况:

undefined method `only_some' for #<ActiveRecord::Relation:0x007fb398d99178>
未定义的方法'only_some'#

我做错了什么?我应该继续使用作用域吗?

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

  • 作用域简化了复杂查询的生成。将作用域视为“惰性”序列,只有在调用者需要值时(即最后)才会对其求值。 因此,您可以通过链接作用域方法来构造复杂查询,而不用担心多个SQL查询会影响性能。 您也可以在类方法中这样做,但灵活性较低。您必须在这些类方法中使用“scoped”方法才能对当前作用域进行操作

  • 可以对关联对象的集合以及单个对象调用作用域方法。这是因为ActiveRecord关联是ActiveRecord::Relation类的实例,可以在其上调用作用域方法,而类方法则不是这样。这正是你们面临的问题。在您的示例中,当您将“only_some”定义为作用域方法时,ActiveRecord将在ActiveRecord::Relation对象上调用“only_some”,而ActiveRecord::Relation对象将在每个Foo上调用该方法。但是,当您将其重新定义为类方法时,您只能在模型类Foo上调用此方法

  • 命名范围并不是死的——你读过文章的最后一段了吗?是的,我在底部看到了“选择你自己的风格”的缩略。尽管如此,本文似乎说,以所示的方式使用方法在功能上等同于作用域。所以我仍然在想,我做错什么了吗?用方法而不是作用域来实现相同的功能是否有不同的方法?我认为第2点是完全正确的。但如果我没有弄错的话,方法(如我的问题所示)在惰性评估方面的行为与作用域相同。
    bar.foos.only_some
    
    undefined method `only_some' for #<ActiveRecord::Relation:0x007fb398d99178>