Rails多对多的关系混乱

时间:2018-06-05 18:55:10

标签: ruby-on-rails

所以我正在开发一个rails应用程序,供用户创建事件(并参加其他创建的事件)。你可以在这里阅读有关作业的内容(对于Odin项目):https://www.theodinproject.com/courses/ruby-on-rails/lessons/associations

无论如何我认为我已经理解了轨道中的多对多关系,但是我看到其他人写这些模型的方式让我感到困惑。

对我而言似乎应该是这样的:

class User < ApplicationRecord
  has_many :attendances
  has_many :events, through: :attendances
end

class Attendance < ApplicationRecord
  belongs_to :user
  belongs_to :event
end

class Event < ApplicationRecord
  has_many :users
  has_many :users, through: :attendances
end

这对我有意义,因为用户可以创建许多事件,并且事件可以有许多用户参加。 (虽然出席可能是错误的词,也许是邀请或其他事情)。

但是我看到了一些奇怪的例子(你可以在下面看到项目中的其他源代码),看起来他们正在为模型添加更多内容并重命名source / foreign_key / class_name。

我错过了什么吗?这仍然允许用户“拥有”一个事件吗?也许我误解了多少对多少的作品。但这至少在我的脑海中应该如何。

作为参考,我看到的其他一些模型与此相似:

class Event < ActiveRecord::Base
    belongs_to :creator, :class_name => "User"
    has_many :event_attendees, :foreign_key => :attended_event_id
    has_many :attendees, :through => :event_attendees
end

class EventAttendee < ActiveRecord::Base
    belongs_to :attendee, :class_name => "User"
    belongs_to :attended_event, :class_name => "Event"
end

class User < ActiveRecord::Base
    has_many :created_events, :foreign_key => :creator_id, :class_name => "Event"
    has_many :event_attendees, :foreign_key => :attendee_id
    has_many :attended_events, :through => :event_attendees, :foreign_key => :attendee_id'
end

与上述类似的东西基本相似。我不确定这是做什么的?或者为什么所有额外的都是必要的。

2 个答案:

答案 0 :(得分:1)

ActiveRecord关联默认为与关联同名的类和外键。这里的代码具体指定了这些,因为它们不是默认代码。

答案 1 :(得分:1)

在你的例子中,一切都按照惯例。也许除了多对多表命名之外。 attendances表格有&#39; user_id&#39;和&#39; event_id&#39;领域。但是如果它可能与其他字段冲突,或者说描述性不够,则可以使用不同的密钥。

belongs_to :creator, :class_name => "User"
默认情况下,

belongs_to :creator会查找Creator模型,因此需要明确指定类名,就像在提供的示例中一样。

has_many :event_attendees, :foreign_key => :attended_event_id

默认情况下,外键为event_id,因此此处也明确指定。

has_many :created_events, :foreign_key => :creator_id, :class_name => "Event"

默认情况下,rails会查找user_id外键和CreatedEvent模型。并明确指定了这些属性。

您只需要了解rails默认提供的属性,以便在需要时进行更改。