1
我有一個Play有很多CostumedActors。 CostumeActor是一個演員和服裝的聯合,它們之間有多對多的關係。has_many:通過,3路加入
這似乎是一個模式,應該是相當普遍的,但我不清楚在軌道中做到這一點的最佳方式。
我現在已經將其設置爲3路連接關聯如下:
class Play < ActiveRecord::Base
has_many :costumed_actors
has_many :actors, :through => costumed_actors
has_many :costumes,:through => costumed_actors
end
class CostumedActor < ActiveRecord::Base
belongs_to :play
belongs_to :costume
belongs_to :actor
end
class Costume < ActiveRecord::Base
has_many :actors, :through => costumed_actors
has_many :plays, :through => costumed_actors
end
class Actor < ActiveRecord::Base
has_many :costumes, :through => costumed_actors
has_many :plays, :through => costumed_actors
end
Rails沒有完全處理這個問題。如果我想看一齣戲的演員或服飾,沒有問題:
play.costumes
play.actors
但是,如果我想看到的演員穿着古裝哪,我不能做
play.actors.costumes
在這種情況下, .costumes給了我所有演員穿戴的所有服裝,不僅僅是現在的服裝。
我必須做的是這樣的:通過增加一個輔助方法給的has_many
play.costumed_actors.where(:actor => @actor).map {|x| x.costumes}
或更乾淨,:通過關聯
class Play
has_many :costumes, :through => costumed_actors do
def for_actor(actor)
where("costumed_actors.actor_id = ?", actor) if !actor.nil?
end
end
end
play.costumes.for_actor(@actor)
而且,加入協會工作不正常。我想能夠做一些像
Play.actors << actor.with_costume(costume)
但我看不出如何階段關聯輔助方法,或者即使這種方法是可能的。
這是表示這種情況的最佳方式嗎?如果是這樣的話,這是讀取/寫入關聯記錄的最佳方式嗎?
謝謝,但是這似乎產生完全相同的SQL作爲一個簡單的'play.actors'有3關係,對於這種查詢,我需要以某種方式指定其中的2個,並獲得第三個,如我的示例'play.actors.with_costume(costume)'。我的一個更大的問題是關於在軌道中使用3表連接表示的正確方法(可能更準確地將其描述爲帶有查詢表的許多元素) – jackpipe 2013-03-08 08:34:57