具有多个链接到同一模型的数据建模

时间:2018-02-20 15:12:13

标签: ruby-on-rails postgresql activerecord

我试图在postgres数据库中为rails应用程序规划一个数据模型,但是我想在将来为运行查询节省大部分时间。这是我的计划:

我有用户,演示文稿和评分。用户既可以参加演讲,也可以参加演讲。因此,用户可以拥有许多"介绍,但以两种不同的方式。 USERS(演示者)和演示文稿将是一对多,而USERS(参与者)和演示文稿将是多对多。

然后有评分。演讲有很多评级。所有评级也以两种方式属于USERS。 USERS(与会者)拥有他们提交的关于演示的所有评级,而USERS(演示者)对他们所呈现的演示有评价。在任何一种情况下,USERS通过演示都有很多评级。

这是设置此功能的最佳数据模型吗?我已经用图形方式在下面描述了它,以便更容易想象:

USERS
- HAS MANY presentations as an attendee - M2M
- HAS MANY presentations as a presenter
- HAS MANY ratings (through presentations) as an attendee
- HAS MANY ratings (through presentations) as an presenter

PRESENTATIONS
- BELONGS TO attendee user - M2M
- BELONGS TO presenter user
- HAS MANY ratings

RATINGS
- BELONGS TO presentations
- BELONGS TO attendee user through presentations
- BELONGS TO presenter user through presentations

1 个答案:

答案 0 :(得分:0)

我会为每种类型的操作执行单独的关联表。您可能只需向presenter_id表添加presentations列,因为您正在描述has_one的{​​{1}}关系,但拥有单独的关联模型可让您灵活如果您选择支持多个演示者的演示文稿,那么将来会成为presenters关系。

使用以下配置,您可以致电has_many以接收提交的用户。或presentation.presenter接收参加的用户列表。或者另一方面,presentation.attendees接收他们参加过的演示文稿列表,或user.attended_presentations接收他们所呈现的演示文稿列表。您可以随意命名关联表,无论您认为哪种方式最有意义。

user.presented_presentations

对于评分,您可以让他们# User.rb has_many :presentation_attendees has_many :attended_presentations, through: :presentation_attendees, source: :presentation has_many :presentation_presenters has_many :presented_presentations, through: :presentation_presenters, source: :presentation # Presentation.rb has_many :presentation_attendees has_many :attendees, through: :presentation_attendees, source: :user has_one :presentation_presenter has_one :presenter, through: :presentation_presenter, source: :user # PresentationPresenter.rb belongs_to :user belongs_to :presentation # PresentationAttendee.rb belongs_to :user belongs_to :presentation belongs_to :presentation,以便您可以通过belongs_to :user或演示文稿的所有评分来提取所有评分的列表使用user.ratings,然后您可以在presentation.ratings类上添加公共实例方法,以检索他们在以下位置展示的所有评分:

User

希望有所帮助!