2012-04-26 68 views
2

我最近發現範圍(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

命名範圍* *不死* - 您是否閱讀過該文章的最後一段? – 2012-04-26 16:42:37

+0

是的,我看到一般的「選擇你自己的風格」收縮在底部。儘管如此,文章似乎說,以所示方式使用方法在功能上等同於範圍。所以我仍然想知道,我做錯了什麼?是否有一些不同的方法可以用方法而不是範圍來實現相同的功能? – 2012-04-26 23:16:11

回答

2

相反,範圍優於類方法,用於查詢的,因爲兩個原因相關對象:

  1. 作用域簡化生成複雜的查詢。將範圍想象爲只有在調用者需要該值(即最後)時才評估的「懶惰」序列。 因此,您可以通過鏈接作用域方法來構造複雜的查詢,而不必擔心多個SQL查詢會影響性能。 您也可以在類方法中這樣做,但靈活性較差。您將不得不在這些類方法中使用'scoped'方法來處理當前的作用域。

  2. 您可以在關聯對象集合上以及單個對象上調用範圍方法。這是因爲ActiveRecord關聯是可以調用作用域方法的ActiveRecord :: Relation類的實例,而類方法則不是這種情況。這正是你面臨的問題。在你的例子中,當你將'only_some'定義爲一個作用域方法時,ActiveRecord將調用ActiveRecord :: Relation對象上的'only_some',而後者將在每個foos上調用該方法。但是,當您將其重新定義爲類方法時,您只能在模型類Foo上調用此方法。

+0

我認爲第二點是完全正確的。但是如果我沒有弄錯,方法(如我的問題所示)在惰性評估方面的表現與範圍相同。 – 2012-04-27 04:50:29

+0

你說得對。我會相應地更新我的答案。 – Salil 2012-04-27 05:07:35

相關問題