4

モデルのインスタンスを別のモデル (つまり、Task1 > Relationship < Task2) を介して同じモデルの別のインスタンスにリンクするアプリがあり、これに has_many :through を使用できるかどうか疑問に思っています。

基本的に、リレーションシップ モデルには追加情報 (type_of_relationship、lag) が含まれるため、結合モデルとして持つことが理想的です。ただし、結合するモデルは 2 つではなく、1 つだけです。has_many :through はまだ機能しますか? その場合、結合テーブルはどのようになりますか? Rails の規則では、Activity_id という 2 つの列があり、これは明らかにデータベースでは機能しません。

あるいは、has_many_and_belongs_to を使用して Task モデルと Relationship モデルの間に多対多を設定することもできますが、これが 1 つの Relationship モデルで 2 つの Task モデルのみをリンクする関係を正確に表しているかどうかはわかりません (もちろん、タスクは複数のリレーションシップに属している可能性があるため、多対多)。

私の本能は、has_many_and_belongs_to を使用してモデルのルールを整理するように言っていますが、これを行うためのより良い方法はありますか? 私はこれでぐるぐる回ります!

どんな助けでも感謝します。

4

1 に答える 1

8

has_many :through はあなたの状況に完全に適合します。モデルの詳細についてはわかりませんが、ユーザーがいて、すべてのユーザーが他のユーザーを連絡先として持つことができるとしましょう。この状況を次のようにモデル化できます。

class User < ActiveRecord::Base
  has_many :contact_records, :foreign_key => :owner_id
  has_many :contacts, :through => :contact_records, :class_name => "User"
end

class ContactRecord < ActiveRecord::Base
  belongs_to :owner, :class_name => "User"
  belongs_to :user
end
于 2009-01-23T08:14:59.650 に答える