2

私は多くの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)

しかし、アソシエーションヘルパーメソッドをフェーズ化する方法、またはそのアプローチが可能であるとしても、私にはわかりません。

これはこのシナリオを表すための最良の方法ですか?もしそうなら、これは関連するレコードを読み書きするための最良の方法ですか?

4

1 に答える 1

0

これを試して:

class Play
  has_many :actors_costumes, :through => :actors, :source => :costumes
end

アクターの衣装は次の方法で入手できます。

play.actors_costumes
于 2013-03-08T05:28:40.600 に答える