事件网站的正确Rails关联是什么?

时间:2014-06-02 20:29:34

标签: ruby-on-rails associations model-associations

我需要一些关于我的rails事件应用程序的建议,我无法弄清楚我在模型中需要的正确关联,所以我将其分解为一些指导。

扬声器&事件模型

  • 一个活动有很多发言者
  • 演讲者可以属于许多活动

Session,Speaker&事件模型

  • 一个事件有很多会话
  • 会话可以属于许多事件
  • 会话有一位发言者
  • 发言人可以属于多个会议

更多信息

这个想法是,活动组织者可以在活动中添加发言人并在活动展示页面上列出,然后更接近活动日期,活动组织者使用会话构建议程。议程视图包含所有会话信息,即时间,标题以及与该会话相关联的发言者信息。

2 个答案:

答案 0 :(得分:1)

我建议添加一个Track类(无论你喜欢什么名字,也许SubjectCategory也适合)。轨道是会话的抽象,会话有时间和发言者,而轨道只是主题,因此许多事件(因此时间)中的许多会话属于单个轨道。

我认为这是做到这一点的方法:

class Event < ActiveRecord::Base
  has_many :sessions
end

class Track < ActiveRecord::Base
  has_many :sessions
end

class Session < ActiveRecord::Base
  has_one :speaker
  belongs_to :event
  belongs_to :track
end

class Speaker < ActiveRecord::Base
  has_many :sessions
end

您提到的所有其他关联实际上都通过这些代理。因此,“一个事件有很多发言者”实际上是“一个事件有很多会议,每个人都有一个发言者”,因为如果一个发言者不在会话中发言,就不会存在,对吗?这就是为什么你不应该做一个直接的事件 - 说话者关系,而是通过事件 - 会话关系代理它。

答案 1 :(得分:1)

由于您计划首先将扬声器添加到事件中,然后允许主持人将它们组织到会话中,我会说您非常接近工作解决方案。以下是我的建议:

class Event
  has_many :events_speakers
  has_many :speakers, through: :events_speakers
  has_many :sessions
end

class Speaker
  has_many :events_speakers
  has_many :events, through: :events_speakers
  has_many :sessions_speakers
  has_many :sessions, through: :sessions_speakers
end

class Session
  # fields include: title, time
  belongs_to :event
  has_many :sessions_speakers
  has_many :speakers, through: :sessions_speakers
end

一些注意事项:

  • 我选择让一个会议让很多发言人来处理小组或讨论案例
  • 发言人拥有并属于许多活动,可以轻松地将过去的发言人添加到新活动中,或者显示一个发言人生物页面,其中列出了他们参加过的活动。

如果您知道自己永远不需要这些功能,那么您可以通过删除HABTM关系来简化。

上述摘要的一个主要变化是我认为会话应该只属于一个事件。会话是在某个特定事件的特定时间发言的人/人的实例,这就是它具有时间属性的原因。如果您将来需要重复这些会话,则将它们复制到新的会话实例

是有意义的