0

関連付けを介して複数の has_many を持つ 2 つのモデル (ユーザーとイベント) があり、現在の関連付けは以下のロジックによるものです。

  1. ユーザーは EventGroup を通じて多くのイベントに参加できます
  2. イベントには、EventGroup を通じて多くのユーザーがいます
  3. ユーザーは Eventgroup を通じて多くのイベントを気に入ることができます
  4. イベントは、Eventgroup を通じて多くのユーザーが好きです

モデル:

class User
 has_many :event_groups
 has_many :events,:through => :event_groups
 has_many :event_likes,:through => :event_groups,:class_name => "Event"
end

class Event
  has_many :event_groups
  has_many :users,:through => :event_groups
  has_many :user_likes,:through => :event_groups,:class_name => "User"
end

class EventGroup
  belongs_to :user
  belongs_to :event
  belongs_to :user_like,:class_name => "User"
  belongs_to :event_like,:class_name => "Event"
end

EventGroup 列:

user_id
event_id
user_like_id
event_like_id

関連付けを設定した後、以下のコードで関連付けレコードを作成しようとしました:

user = User.first
user.event_likes << Event.first  
user.save

ここに画像の説明を入力 ここでは、`user_like_id & event_like_id の代わりに user_id & event_like_id を使用してレコードが作成されます

しかし、 でユーザー レコードを取得できないevent.user_likesため、イベント グループ レコードを確認しました。それはnil value for user_like_id.

#<EventGroup id: 24, event_id: 1, user_id: 2,event_like_id: 1, user_like_id: nil>

これを行う適切な方法を教えてください。

4

4 に答える 4

0

よくわかりませんが、関係で定義する必要があるかもしれませinverse_ofhas_many

class User
 #...
 has_many :event_likes, :through => :event_groups, :inverse_of => :user_likes, :class_name => "Event"
end

class Event
  #...
  has_many :user_likes, :through => :event_groups, :inverse_of => :event_likes, :class_name => "User"
end

のドキュメントの上の章を参照してください:throughhas_many

于 2013-01-24T15:38:25.300 に答える
0

.where 形式を使用すると、.where("event_groups.user_like_id = ?", 17) のような文字列を渡して、結合されたタグ付けテーブルを修飾できます。

例えば:

User.joins(:event_groups).where("event_groups.user_like_id = ?", 17)
于 2013-01-24T15:22:46.060 に答える
0

1 つの関係で異なる概念である 2 つの多対多の関係 (Users-Participate-In-Events と Users-Like-Events) をモデル化しようとしているように思えます。ここでは、ユーザーが好きではなくてもイベントに参加でき、その逆も可能であると想定しています。その場合、EventGroup参加関係のみを表すモデルを 維持しEventLikes、好きなものを表す別のモデルを作成します。2 つのテーブルの列は同じですが、異なる関係を表しています。その後、イベントを(eventsまたはevent_likes)に追加すると機能するはずです

于 2013-01-24T16:40:22.470 に答える
0

リレーションシップ モデル、私のコードを使用して、同じモデル (ユーザー-ユーザー) 間に同様の関係を作成します。

has_many :relationships, foreign_key: "follower_id", dependent: :destroy

has_many :followed_users, through: :relationships, source: :followed

has_many :reverse_relationships, foreign_key: "followed_id", class_name: "Relationship", dependent: :destroy

has_many :followers, through: :reverse_relationships, source: :follower

于 2013-01-25T08:05:07.047 に答える