私は多くのCostumedActorsを持っている演劇を持っています。コスチュームアクターは、多対多の関係を持つアクターとコスチュームの結合です。
これはかなり一般的なパターンのようですが、レールでそれを行うための最良の方法についてはわかりません。
私は現在、次のように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は、現在の演劇だけでなく、すべての演劇にわたって、各俳優が着ているすべての衣装を私に与えます。
私は次のようなことをしなければなりません:
play.costumed_actors.where(:actor => @actor).map {|x| x.costumes}
またはよりクリーンに、has_many:throughアソシエーションにヘルパーメソッドを追加します
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)
しかし、アソシエーションヘルパーメソッドをフェーズ化する方法、またはそのアプローチが可能であるとしても、私にはわかりません。
これはこのシナリオを表すための最良の方法ですか?もしそうなら、これは関連するレコードを読み書きするための最良の方法ですか?