0

:through を使用するときに、問題の両方のモデルで常に has_many :assignments 関連付けも指定する必要があるのはなぜですか? これはDRYですか?指定しなくてもいい場合や、違う場合はありますか?説明ありがとうございます。

class Programmer < ActiveRecord::Base
  has_many :projects, :through => :assignments
  has_many :assignments # Why that?
end

class Project < ActiveRecord::Base
  has_many :programmers, :through => :assignments
  has_many :assignments # Why that?
end

class Assignment < ActiveRecord::Base
  belongs_to :project
  belongs_to :programmer
end

アップデート

has_many :throughについて話していることが十分に明確ではなかったようです。したがって、この時点で与えられた答えは、私の質問にはあまり当てはまりません。もう一度:

has_many :assignmentsがすでにあるのに、なぜ常に が必要なのhas_many :projects, :through => :assignmentsですか? Rails はhas_many :assignments自分自身を自動的に追加するべきではありませんか?

4

3 に答える 3

3

以下のことを理解することが重要だと思います。

と の間に多対多の関係がProgrammerありますProject。この関係を解決するために、 というジャンクション モデルを追加しましAssignment

実際には、テーブルprojectsは にリンクされていません。代わりprogrammersに両方が接続されています。assignments

次のようなものがあります。

class Programmer < ActiveRecord::Base
  has_many :assignments
end

class Project < ActiveRecord::Base
  has_many :assignments
end

class Assignment < ActiveRecord::Base
  belongs_to :project
  belongs_to :programmer
end

assignmentsただし、プログラマに関連するすべてのプロジェクトを検索するたびにテーブルにアクセスする必要はありません。この接続を容易にするために、 と の間に直接リンクを作成できProgrammerますProject。だから、あなたはそれを言うことができますa programmer has many projects through the table assignments

その結果が現在のセットアップです。この構成がなければ、たとえばできませんでした。

#find a programmer
@programmer = Programmer(1)  
#find all projects related to this programmer
@projects = @programmer.projects

上記の例では、それらの間にテーブルがあることを覚えておく必要さえありませんassignments

こちらもご覧ください: http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

それが役立つことを願っています...

編集

図が含まれているので、説明しようとしていることを視覚化できます。

ProjectとはProgrammer直接リンクされていません。というわけでhas_many :projects, :through => :assignments、Rails の機能は、あなたの代わりに考えやすくするためのものです。has_many :assignmentsいいえ、テーブルへの実際の接続である を置き換えるものではありませんassignments

さらに、この:through =>機能は他の状況でも使用できます。

ここに画像の説明を入力

于 2012-07-10T12:27:23.747 に答える
0

has many x through x 行は、それ自体で関係を定義します。あなたの場合、プログラマーが多くのプロジェクトを持っており、割り当てモデルを見ることでこの関係を知ることができることをプログラマーモデルに伝えます。ただし、これは割り当てモデル自体との関係を指定していません。したがって、2行目が必要な理由。

于 2012-07-10T11:54:38.090 に答える
0

プログラマーとプロジェクト インスタンスの両方から割り当てにアクセスできるようにしたい場合 (およびその割り当てに有用なデータが含まれている場合)、はい、それぞれにその関連付けを含める必要があります。

ただし、必須ではありません。したがって、割り当てにアクセスする必要がなく、実際には単なる結合テーブルである場合は、省略してください。

于 2012-07-10T11:58:52.460 に答える