如果我有一個有很多 B 的類 A,但 B 只是一個類的 ID,并且實際上可以采用多個不同類的形式,我可以根據它是什么類來動態加載 B 的關聯嗎?
例如,如果 B 是 Car 類的 id,我是否能夠以某種方式急切加載 B.wheels。但是如果它是Dog型別的,我可以得到B.Toys嗎?這一切都將通過 A,它只有一種型別別。我嘗試了語法:
notifs = current_user.notifications.includes(target: [:wager_members, :disputes, :games])
其中通知屬于 A 類,:target 將是動態 B 類,:wager_members、:disputes 和 :games 將是取決于 B 類的關聯。
但是,我收到一條錯誤訊息,說 B 類沒有 F 類,這是有道理的,因為 B 類是動態變化的。有沒有一種方法/語法可以一口氣加載所有嵌套的關聯?
我想知道是否需要重新考慮模型關聯以使其可行。
uj5u.com熱心網友回復:
多型關聯是這里的關鍵: https ://guides.rubyonrails.org/association_basics.html#polymorphic-associations
以下是您的關聯在班級級別的大致情況
User
has_many :notifications
Notification
belongs_to :user
belongs_to :target
Target
belongs_to :notify, polymorphic: true # Can be any model
然后,您應該能夠執行以下操作:
Notification.create(user: user, target: wager_member)
Notification.create(user: user, target: dispute)
Notification.create(user: user, target: game)
notifs = current_user.notifications.includes(target: [:wager_members, :disputes, :games])
notifs.first.target.notify.class.name # "WagerMember"
實際上,您可以跳過目標模型并將多型關聯移動到通知本身。雖然如果您需要添加一些自定義邏輯可能會很有用。這導致:
Notification
belongs_to :user
belongs_to :target, polymorphic: true
notifs.first.target.class.name # "WagerMember"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/443724.html
