所以我正在處理一組具有簡單belongs_to
關係的模型。例如D belongs_to
C
其中belongs_to
B其中belongs_to
答:我經常發現自己需要訪問「D的A」,我通常會寫d_instance.c.b.a
,但這個變得非常快。在Rails中鏈接belongs_to關係
有沒有什麼魔法可以加到D的模型上,這會讓我直接跳到d_instance.a
?要做到這一點
所以我正在處理一組具有簡單belongs_to
關係的模型。例如D belongs_to
C
其中belongs_to
B其中belongs_to
答:我經常發現自己需要訪問「D的A」,我通常會寫d_instance.c.b.a
,但這個變得非常快。在Rails中鏈接belongs_to關係
有沒有什麼魔法可以加到D的模型上,這會讓我直接跳到d_instance.a
?要做到這一點
不能使用through
與belongs_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
#b
到C
,當你調用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
一種方法是創建實例D
一個方法,它返回正確的關聯關係:
class D
...
def a
self.c.b.a
end
end
有趣,我會先試試這個。 – Joe
@Joe,我在'委託人'中犯了一個錯誤,我就修好了。 – RustyToms
@Zajn,謝謝你的迴應。不過,這個答案是首選,因爲它提供了直接處理任何父對象的靈活性。 – Joe