如果没有命名范围那么如何?

时间:2012-04-26 16:03:12

标签: ruby-on-rails-3 activerecord

我最近发现了范围(me == Rails noob)。凉。但named scopes are dead我发现了。我想做得对,所以我改变了:

 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>

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

1 个答案:

答案 0 :(得分:2)

相反,范围比查询关联对象的类方法更受欢迎,原因有两个:

  1. 范围简化了复杂查询的生成。将范围视为“懒惰”序列,仅在调用者需要值(即最终)时才进行评估。 因此,您可以通过链接范围方法来构造复杂查询,而不必担心多个SQL查询所遇到的性能。 您也可以在类方法中执行此操作,但灵活性较低。您必须在这些类方法中使用'scoped'方法来处理当前范围。

  2. 您可以在关联对象的集合以及单个对象上调用范围方法。这是因为ActiveRecord关联是ActiveRecord :: Relation类的实例,可以在其上调用范围方法,而类方法则不是这种情况。这正是你所面临的问题。在您的示例中,当您将'only_some'定义为范围方法时,ActiveRecord将在ActiveRecord :: Relation对象上调用'only_some',而后者将在每个foos上调用该方法。但是当您将其重新定义为类方法时,只能在模型类Foo上调用此方法。