我有两个模型(用户和事件)和多个has_many通过关联,其中我当前的关联是由以下逻辑:
型号:
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_id&amp;创建的。 event_like_id而不是`user_like_id&amp; 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>
让我知道正确的方法。
答案 0 :(得分:0)
使用.where格式,您可以传递类似.where(“event_groups.user_like_id =?”,17)的字符串来限定连接的标记表。
例如:
User.joins(:event_groups).where("event_groups.user_like_id = ?", 17)
答案 1 :(得分: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
一章
答案 2 :(得分:0)
在我看来,你正试图模拟两个多对多关系(用户参与事件和用户事件),它们是一个关系中的不同概念。我假设一个用户可以参与一个事件而不喜欢它,反之亦然。在这种情况下,请将EventGroup
建模为仅表示参与关系,并创建另一个EventLikes
模型来表示喜欢。两个表中的列将是相同的,但代表不同的关系。之后,将事件添加到(events或event_likes)应该可以正常工作
答案 3 :(得分: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