【问题标题】:How do I set up a has many through for two different associations between the the same models如何为相同模型之间的两个不同关联设置一个有多个通过
【发布时间】:2013-08-31 19:30:44
【问题描述】:

我有两个模型,一个User 和一个Event,我想在它们之间建立两个不同的关联。

我想要:
- 一个用户可以举办许多活动
- 一个用户参加了很多活动
- 属于一个用户(所有者/创建者)的事件
- 属于许多用户(参加者)的活动

对于参加的活动来说,这是一个拥有和属于许多关系的关系,而对于主办的活动来说只是有很多关系,我只是不知道如何正确设置它/rails 方式。

我知道我需要一个 users_attended_events 表

认为User 模型上会是这样的

has_many :events, through: :hosted_events
has_many :events, through: :attended_events

但是我会如何处理Event 的模型呢?

我有:

belongs_to: user
alias_attribute :owner, :user
alias_attribute :creator, :user

has_many :users, through:??? 

这应该是 users_attended_events 表,所以.. 我会在这里放什么?我如何命名这个“与会者”

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 relationship rails-activerecord


    【解决方案1】:

    听起来你不需要一个 has_many through 关联来托管事件的用户。如果您的events 表中有hosted_by_id 列,则这样的东西应该足够工作(在user.rb 中):

    has_many :hosted_events, class_name: "Event", foreign_key: "hosted_by_id"
    

    对于参加活动,假设加入带有 attendee_idevent_id 列的类:

    class AttendeeEvent < ActiveRecord::Base
    
      belongs_to :attendee, class_name: "User"
      belongs_to :event
    
    end
    

    您可以将以下关联添加到 user.rb

    has_many :attendee_events, foreign_key: "attendee_id"
    has_many :attended_events, through: :attendee_events, source: :event
    

    source: :event 选项表示此关联的目标对象是从加入对象的event 关联中找到的。

    event.rb 中的关联是:

    belongs_to :hosted_by, class_name: "User"
    has_many :attendee_events
    has_many :attendees, through: :attendee_events
    

    【讨论】:

    • user.rb has_many :attendee_events 中第一行 has_many 的用途是什么?语义上,我不明白。一个用户有很多参加的活动。我知道参加者事件是联接表/类。但我想,我不明白为什么需要将这两个 has_many 分开。
    • 另外,如果我使用attendance 而不是attendee_event,the rails way 是否会不赞成? (我知道 Rails 约定是 model1_model2)
    • 实际上,因为我已将事情重命名为参加者事件 .. 我认为这在语义上是有意义的。谢谢!
    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多