所以我正在开发一个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
与上述类似的东西基本相似。我不确定这是做什么的?或者为什么所有额外的都是必要的。
答案 0 :(得分:1)
答案 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默认提供的属性,以便在需要时进行更改。