繁体   English   中英

Rails has_many:通过关联

[英]Rails has_many :through association

我正在尝试创建一个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

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

另请阅读我只有在添加参与者后才能建立会议关系。 这会是要走的路吗? 谢谢!

不,您不需要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

has_many:通过 Ruby Guides中的解释与您想要做的类似,请查看它。

首先,您不需要参与者模型。 如果我想在会议模型中存储一些额外信息,这是我将使用的结构。 如果没有,您可以直接使用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

你不想这样做:

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通过...不复杂=)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM