3

取り組んでいるプロジェクトにスタイルの関連付けを適用してきhas and belongs to manyましたが、結合モデルで追加の情報を取得したかったためbelongs_to、. 最初にこれに出くわした後、モデル User にこれらの両方の定義が必要であることを知りました (対応する Show モデルでも同じです)。has_manyhas_and_belongs_to_many

has_many :saved_shows
has_many :shows, :through :saved_shows

私の質問は、Rails 構文の設計に関するものです。なぜなら、ここで全体像を見落としていないことを確認したいからです。なぜ最初の構文が必要なのですか? という非標準名の中間体を介してユーザーがショーのリストにアクセスできることを確立している場合saved_shows、なぜ も確立するのhas_many :saved_showsでしょうか?

これに引っかかったのは私が初めてではないと思うので、Rails がこの一見冗長な定義を必要とする理由に興味があります。構文の選択が不適切なだけなのか、それとも背後にもっと深い設計があるのか​​?

4

1 に答える 1

3

Rails はこの:throughオプションを使用して、既に定義されている別の関連付けを参照します。これは、複雑な関連付けを定義して同じ行で参照することなく、最初に複雑な関連付けをきれいに設定できるようにするためだと思います。

たとえば、次の (不必要に複雑な) 例を考えてみましょう。

has_many :users, :class_name => 'Person', :foreign_key => 'owner_id'
has_many :tasks, :through => :users, :class_name 'Job'

このすべての情報をインラインで表現する明確な方法はありません。

さらに(質問でこれを暗示しているかどうかはわかりません)、両方の関連付けに明示的に直接アクセスできます。したがって、ユーザーhas_many :tasksが との場合、 と の両方にアクセスするhas_many :milestones, :through => :tasksことができます。@user.tasks@user.milestones

したがって、この例では多かれ少なかれ結合テーブル (2 つの外部キー、タイムスタンプ、およびおそらく 1 つまたは 2 つの属性) を処理するのに役立つだけでなく、使用する大規模なモデルを使用できますhas_many :through

それはあなたの質問に答えるのに役立ちますか? あなたがすでに知っていることのどれだけかわからない.

于 2010-10-13T11:02:27.600 に答える