2016-10-18 82 views
0

我在我的食譜模型連接到我的標籤模式使得許多一對多/有一對多,通過關係:軌道4:將複雜的過濾器進入範圍

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :recipes, through: :taggings 
end 

class Tagging < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :recipe 
end 

class Recipe < ActiveRecord::Base 
    has_many :taggings 
    has_many :tags, through: :taggings 
end 

...有沒有辦法通過一個範圍過濾具有相同標籤的食譜?我對範圍很陌生,但我發現它們比方法更有用,而且我只能通過方法實現通過標記名稱進行搜索和過濾。

例如,這將讓我標記指定名稱的所有食譜:

def self.tagged_with(name) 
    Tag.find_by_name!(name).recipes 
end 

回答

-1

基本上可以轉換大多數協會法鏈(雖然不是全部*)爲範圍

如我倒是試試這個(注:錯誤未測試),看看它是如何變成了

scope :tagged_with, ->(name) { find_by_name!(name).recipes } 

如果不工作,我會嘗試這樣的:

scope :tagged_with, ->(name) { where(:name => name).first.recipes } 

[*]使用範圍過鏈式方法調用的最大問題是,find/first可有的時候奇怪的事情,如果它沒有找到一個... Rails中的代碼字面上默認爲all範圍,有些情況下(這是我認爲不應該發生的奇怪行爲),因此對於只能找到單個項目的範圍,我通常不會打擾範圍並像原來一樣使用類方法。

+0

對不起,但這不起作用 –

+0

它不允許像我期望的鏈接 –

+0

是的,它不會允許鏈接,因爲你只選擇一個鏈接。你能否用一個你想如何使用它的例子來更新你的問題(如果它存在的話),給出一個具體的例子其他鏈式方法?它可能是這樣的:a)你想做的事實際上不能完成b)你想做的事可以用其他方式做得更好 –