Rails has_many :through 关联

4

我希望你能帮助我创建一个Rails应用,用户可以创建事件并邀请参与者参加。我一直在尝试一些方法,但似乎都不对,这让我很疯狂!我正在使用Rails 4。

你会如何设置活动模型?

User
has_many :events through :meeting   //for the participants?
has_many :events     // for the organizer?

Event
belongs to :user
has_many :participants, class_name: "User"


Participant
belongs to :user
has_many :events through :meeting

Meeting
has_many :participants
has_many :events

这有意义吗? 我需要使用参与者模型还是我只是过分设计了它? 我想我有点困惑,组织者是用户,参与者也是用户,会议需要组织者和参与者,所以不太清楚如何使其工作...

另外,我读到只有在添加了参与者后才能建立会议关系。这是正确的方法吗? 谢谢!


请查看以下网址:http://stackoverflow.com/questions/21806860/rails-associations-users-has-many-users-through-comments/21807202#21807202 - Prasad Surase
3个回答

3

不需要使用Participant模型:

User
has_many :meetings
has_many :events, through: :meetings

Event
has_many :meetings
has_many :participants, through: :meetings, class_name: "User"

Meeting
belongs_to :user
belongs_to :event

User 的实例中,您可以进行以下操作:

user.events # => List of Events

通过 Event 的实例,您可以执行以下操作:

event.participants # => List of Users

《Ruby指南》中的has_many :through解释与您想要做的事情类似,可以去查看一下。


1

首先,您不需要参与者模型。如果我想在会议模型中存储一些额外信息,我将使用此结构。如果没有,您可以直接使用has_and_belongs_to_many。

User
has_many :meetings
has_many :attending_events, through: :meetings, source: "Event"   //for the participants
has_many :events     // for the event organiser

Event
belongs to :user // The organiser
has_many :meetings
has_many :participants, through: :meetings, source: "User"  

Meeting
belongs_to :participant, class_name: "User"
belongs_to :attending_event, class_name: "Event" // Use attending_event_id as foreign_key

谢谢。我会用这种方式尝试一下。真的很有帮助。 - user7330
太棒了。我快完成了!只有一个问题需要澄清。对于Meeting,它应该是Meeting belongs_to :event还是 belongs_to :attending_events?我猜我的Meeting迁移应该有:participant_id和attending_event_id,而不是user_id和event_id?再次感谢。 - user7330
你可以使用它来使其更语义化。我正在编辑答案。 - Super Engineer
有几个问题,但最终解决了。 需要使用源代替class_name进行has_many through,在meeting中应该是belongs_to:event而不是attending_event,在Event中参与者不需要class_name。这些问题真的帮助我让它工作起来了。https://dev59.com/0Goy5IYBdhLWcg3wWcig - user7330
我根据您的评论编辑了我的答案,以便它可以帮助其他人。 - Super Engineer

0

你不想做的事情:

has_many :events
has_many :events #doesn't matter that it's a through table

我以前做过这个,并且做得很好...

User
  has_many :invites, dependent: :destroy
  has_many :invited_events, through: :invites, source: :event

Event
  has_many :invites, dependent: :destroy
  has_many :invitees, through: :invites, source: :user

Invite
  belongs_to :event
  belongs_to :user

然后在邀请加入表格中,添加一个布尔列 creator 以知道该用户是否创建了事件。你也可以添加一个列来显示用户是否接受了邀请(以显示参与情况)。

简单明了的 has_many through... 非常简单 =)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接