Ruby on rails 活动网站的正确Rails关联是什么?

Ruby on rails 活动网站的正确Rails关联是什么?,ruby-on-rails,associations,model-associations,Ruby On Rails,Associations,Model Associations,我需要一些关于rails事件应用程序的建议,我无法找出我在模型中需要的正确关联,因此我将其分解以获得一些指导 演讲者与事件模型 一个活动有许多演讲者 演讲者可以参加许多活动 会话、演讲者和事件模型 一个事件有许多会话 一个会话可以属于许多事件 一次会议有一名发言者 一个演讲者可以参加许多会议 更多信息 其想法是,活动组织者可以将发言者添加到活动中,并将其列在活动展示页面上,然后在接近活动日期时,活动组织者使用会话构建议程。议程视图包含所有会话信息,即时间、标题以及与该会话相关的演讲者信息

我需要一些关于rails事件应用程序的建议,我无法找出我在模型中需要的正确关联,因此我将其分解以获得一些指导

演讲者与事件模型
  • 一个活动有许多演讲者
  • 演讲者可以参加许多活动
会话、演讲者和事件模型
  • 一个事件有许多会话

  • 一个会话可以属于许多事件
  • 一次会议有一名发言者
  • 一个演讲者可以参加许多会议
更多信息
其想法是,活动组织者可以将发言者添加到活动中,并将其列在活动展示页面上,然后在接近活动日期时,活动组织者使用会话构建议程。议程视图包含所有会话信息,即时间、标题以及与该会话相关的演讲者信息。

我建议添加一个
曲目
类(可以随意命名,也可以选择
主题
类别
)。音轨是会话的抽象,会话有时间和说话人,而音轨只与主题有关,因此许多事件中的许多会话(因此时间)属于单一音轨

我认为这是一种方法:

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
class事件

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

因为你计划先将演讲者添加到事件中,然后再允许主持人将他们组织到会话中,所以我认为你非常接近一个可行的解决方案。以下是我的建议:

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关系来简化


与上面的总结相比,一个主要的变化是,我认为一次会议应该只属于一个事件。会话是一个人或多个人在特定时间、特定事件上讲话的实例,这就是它具有时间属性的原因。如果将来需要重复这些会话,将它们复制到新的会话实例是有意义的

最后两个会话似乎是
会话所属的:speaker;演讲者有很多:会话
。其余的部分要么是
has_,要么是
has_-many
或者
has_-many:to
,这取决于是否有更多与关联相关的数据。“一个会话可以属于许多事件”:这对我来说没有意义。一个会话应该只属于一个事件。为什么一个会话属于多个事件?仅仅在一个活动中发生,这不是一件及时的事情吗?因为在他完成活动后,会为下一年做好准备,因此会议将在两个活动中进行,直到新活动有更多最新的发言人。所有过去的事件都可供公众使用,即使它们已完成。复制事件时,还应复制会话。做一份深拷贝。在旧事件中让新偶数点指向会话是没有意义的。如果您随后修改会话,则旧会话也将被修改。您的解释正是我想要的,但我收到一个Mongoid错误-问题:无效选项:通过提供给关系:演讲者。摘要:Mongoid检查传递给关系宏的选项,以确保不会因遗漏某些内容而产生不良副作用。是的,Mongoid处理双边关系有点不同,因为它是一个文档存储,而不是关系数据库。您需要使用以下语法:但要小心,因为在mongo中存储多方面的关系需要大量内存和空间,所以它将是has_和_属于许多扬声器。另一方面,您不需要联接表:)