0

我有两个模型(用户和事件),通过关联有多个 has_many,我当前的关联是通过以下逻辑:

  1. 用户可以通过 EventGroup 参与很多活动
  2. Event通过EventGroup拥有很多用户
  3. 用户可以通过事件组喜欢许多事件
  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

事件组列:

user_id
event_id
user_like_id
event_like_id

建立关联后,我尝试使用以下代码创建关联记录:

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

在此处输入图像描述 这里记录是用 user_id & event_like_id 而不是 `user_like_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

使用 .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

在我看来,您正在尝试对两种多对多关系(用户参与事件和用户喜欢事件)建模,它们是一种关系中的不同概念。我在这里假设用户可以在不喜欢的情况下参与事件,反之亦然。在这种情况下,保持EventGroup建模以仅表示 Participation 关系,并创建另一个 EventLikes模型来表示 Likes。两个表中的列相同,但代表不同的关系。之后,将事件添加到(事件或 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 回答
0

我不确定,但您可能需要inverse_of在您的has_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

请参阅:through文档中的章节has_many

于 2013-01-24T15:38:25.300 回答