2013-12-22 38 views
1

所以我正在處理一組具有簡單belongs_to關係的模型。例如D belongs_toC其中belongs_to B其中belongs_to答:我經常發現自己需要訪問「D的A」,我通常會寫d_instance.c.b.a,但這個變得非常快。在Rails中鏈接belongs_to關係

有沒有什麼魔法可以加到D的模型上,這會讓我直接跳到d_instance.a?要做到這一點

回答

1

不能使用throughbelongs_to,但你可以使用delegate。以下是delegate的文檔:http://api.rubyonrails.org/classes/Module.html#method-i-delegate

您可以在模型上使用delegate來調用另一個類的方法,就好像它屬於模型一樣。在這些示例中,大寫字母是類,小寫字母是類的實例或方法名稱。因此,在您的情況下,D的方法#c使得d.c返回C的關聯實例。 C具有方法#b,使得c.b返回B的關聯實例,並且B具有返回A的關聯實例的方法#a

如果你去D模型和delegate#bC,當你調用d.b這將是一樣的,如果你叫d.c.b。由於這可能是混亂的,這裏是代碼,您需要:

class D < ActiveRecord::Base 
    attr_accessible :this, :that, :the_other 

    belongs_to :c 

    delegate :b, to: :c 
    delegate :a, to: :b 

end 

一旦你重新啓動你的服務器d.a會給你同樣的結果d.c.b.a

+0

有趣,我會先試試這個。 – Joe

+0

@Joe,我在'委託人'中犯了一個錯誤,我就修好了。 – RustyToms

+0

@Zajn,謝謝你的迴應。不過,這個答案是首選,因爲它提供了直接處理任何父對象的靈活性。 – Joe

1

一種方法是創建實例D一個方法,它返回正確的關聯關係:

class D 
... 
    def a 
    self.c.b.a 
    end 
end