我最近发现了范围(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>
我做错了什么?我应该继续使用范围吗?
答案 0 :(得分:2)
相反,范围比查询关联对象的类方法更受欢迎,原因有两个:
范围简化了复杂查询的生成。将范围视为“懒惰”序列,仅在调用者需要值(即最终)时才进行评估。 因此,您可以通过链接范围方法来构造复杂查询,而不必担心多个SQL查询所遇到的性能。 您也可以在类方法中执行此操作,但灵活性较低。您必须在这些类方法中使用'scoped'方法来处理当前范围。
您可以在关联对象的集合以及单个对象上调用范围方法。这是因为ActiveRecord关联是ActiveRecord :: Relation类的实例,可以在其上调用范围方法,而类方法则不是这种情况。这正是你所面临的问题。在您的示例中,当您将'only_some'定义为范围方法时,ActiveRecord将在ActiveRecord :: Relation对象上调用'only_some',而后者将在每个foos上调用该方法。但是当您将其重新定义为类方法时,只能在模型类Foo上调用此方法。