我需要一些关于我的rails事件应用程序的建议,我无法弄清楚我在模型中需要的正确关联,所以我将其分解为一些指导。
这个想法是,活动组织者可以在活动中添加发言人并在活动展示页面上列出,然后更接近活动日期,活动组织者使用会话构建议程。议程视图包含所有会话信息,即时间,标题以及与该会话相关联的发言者信息。
答案 0 :(得分:1)
我建议添加一个Track
类(无论你喜欢什么名字,也许Subject
或Category
也适合)。轨道是会话的抽象,会话有时间和发言者,而轨道只是主题,因此许多事件(因此时间)中的许多会话属于单个轨道。
我认为这是做到这一点的方法:
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关系来简化。
上述摘要的一个主要变化是我认为会话应该只属于一个事件。会话是在某个特定事件的特定时间发言的人/人的实例,这就是它具有时间属性的原因。如果您将来需要重复这些会话,则将它们复制到新的会话实例
是有意义的