0

編輯協會:這可能會幫助到我的問題點......不能訪問嵌套的許多一對多的has_many:通過從父對象

有沒有辦法通過做「級聯」:聯想?例如,如果我們隨骨頭歌曲一起走:「腳骨連接到腳踝骨,腳踝骨連接到腿骨,腿骨連接到髖骨......」我不想說那隻腳有髖骨,因爲那不完全準確。我也不想說腳通過腿骨有髖骨(因爲它也需要穿過腳踝)。不,相反,腳has_many臀部穿過腿部的腳踝。將腳連接到腳踝,然後將腳組件連接到腿,然後將整個foot_ankle_leg組件最終連接到臀部。因此,一隻腳可以有多個臀部,但是腳並不屬於臀部,這種關聯僅作爲特定foot_ankle_leg組件的一部分存在。

爲了表示這樣的事情,我是否正確地設置了通過表格來將腳/踝/腿連接「擡」到臀部? (即a_b_c_d_e表是一個類似於「最終」 foot_ankle_leg_hip組裝)


原題:有幾種模式,與各種干預許多一對多走到一起:通過表。由於這些通過表包含附加屬性,因此不使用HABTM。

下面是它如何組合在一起的圖像,綠色框是多對多連接表。爲了簡潔起見,更名爲信

Database chart

這裏的結構是怎樣編碼

class A < ApplicationRecord 
    has_many :a_bs 
    has_many :bs, through: :a_b 
... 
end 

class B < ApplicationRecord 
    has_many :a_bs, 
    has_many :as, through: :a_b 
... 
end 

class AB < ApplicationRecord 
    belongs_to :a 
    belongs_to :b 
    has_many :a_b_c_ds 
    has_many :c_ds, through: :a_b_c_d 
... 
end 

class C < ApplicationRecord 
    has_many :c_ds 
    has_many :ds, through: :c_d 
... 
end 

class D < ApplicationRecord 
    has_many :c_ds 
    has_many :cs, through: :c_d 
... 
end 

class CD < ApplicationRecord 
    belongs_to :c 
    belongs_to :d 
    has_many :a_b_c_ds 
    has_many :a_bs, through: :a_b_c_d 
... 
end 

class ABCD < ApplicationRecord 
    belongs_to :a_b 
    belongs_to :c_d 
    has_many :a_b_c_d_es 
    has_many :es, through: :a_b_c_d_e 
... 
end 

class E < ApplicationRecord 
    has_many :a_b_c_d_es 
    has_many :a_b_c_ds, through: :a_b_c_d_e 
... 
end 

class ABCDE < ApplicationRecord 
    belongs_to :a_b_c_d 
    belongs_to :e 
... 
end 

每當我試着從控制檯父對象訪問嵌套的孩子,像A.first.a_b_c_ds,它返回

#<ABCD::ActiveRecord_Associations_CollectionProxy:0x26ca578>

這是我應該看到的嗎?我是否需要直接與該CollectionProxy交互,而不是看到「常規」記錄輸出?如果是這樣,這是一個新的東西,我需要了解:)

在讀出,我也注意到,它試圖找到通過表中的父母的ID,而不是相關聯的「孩子」ID 。

ABCD Load (0.3ms) SELECT "a_b_c_ds".* FROM "a_b_c_d" WHERE "a_b_c_d"."a_id" = ? [["a_id", 1]] 

現在很明顯,a_id將不在表ABCD中。但ab_id在那裏,其中a_id關聯。如果我正確地閱讀導軌指南,如果我正確安裝,導軌應該足夠聰明以便作出區分。

任何想法我錯了嗎?

類名不一定按字母順序排列。例如,Wrapping,Package,Object,WrappingPackage,WrappingPakakgeObject。但是由於我使用的命名多對多通過:表,我的理解表名應該不重要。只有在使用has_many_and_belongs_to連接表時纔會發揮作用。但是,我在哪裏?

感謝您的幫助!讓我知道,如果你需要更多的片段!

+1

您的示例:'A.first.a_b_c_ds'似乎有誤,A中沒有'a_b_c_ds'關聯。 –

+0

啊,好吧!所以如果我正確地聽到你的話,關聯不會像Class繼承那樣自動堆疊或級聯?這些關聯必須在「數據鏈」本身上下明確定義? – Spectator6

回答

1

每個belongs_to或has_many調用都會在該類的所有實例中創建一個關聯方法。

所以,當你這樣做:

class A 
    has_many bs 
end 

class B 
    has_many cs 
end 

,那麼你基本上都添加方法bs所有A的實例。 A中沒有方法cs,並且沒有涉及其他魔法。

+0

好吧,這是有道理的!那麼,有沒有辦法像雙通或三通那樣?例如,如果我們連骨歌:「該足骨連接到腳踝骨,腳踝骨的連接腿骨,腿骨的連接到髖骨......」我不想說那腳有has_many髖骨。我也不想說腳通過腿骨有髖骨(因爲它也需要穿過腳踝)。爲了表示這樣的事情,我是否正確地設置了通過桌子的中間部分來將腳/踝/腿連接「擡」到臀部? – Spectator6