【发布时间】:2014-08-29 05:12:02
【问题描述】:
我是新晋 Rails“开发者”,这是我的第一个 StackOverflow 问题(耶!)。我正在构建一个应用程序(用于我的班级期末项目),它允许用户通过预测给定电视节目的活动和事件来赚取积分。到目前为止玩得很开心,但是,在构建定义以下模型之间关联的最佳方法时遇到了麻烦。
我研究了三个模型之间的三向关联,但大多数答案(例如 How to query across three models 和 Right association between three models )并没有解决 所有三个模型之间的 HABTM 关联 ...所以你的非常感谢您的帮助!
我的问题概述:
一个节目由许多集组成,每个节目都有许多参赛者(角色)。通过节目关联,参赛者和剧集应该有 HABTM 关系,但我的应用不需要那个片段......
棘手的部分是每个参赛者可以在给定的分 >剧集。我想做的是记录每个参赛者每集获得的积分,然后在我需要为用户计算积分时查询。
我已经尝试了一个连接表 contestants_points,其属性为 episode_id 作为第三列,但这不起作用。我也玩弄过表 contestants_episodes_points 的想法,但不知道如何为该表创建一个新实例。以下是我对构建以下模型的尝试:
contestant.rb
class Contestant < ActiveRecord::Base
belongs_to :show
has_and_belongs_to_many :points, inverse_of: :contestants
has_many :episodes, through: :points # not sure about this
end
示例:参赛者 1 = { 姓名:'Gloria',年龄:30,职业:'护士,show_id:1 }
episode.rb
class Episode < ActiveRecord::Base
belongs_to :show
has_and_belongs_to_many :points, inverse_of: :episodes
has_many :contestants, through: :points # not sure about this
end
示例:第 1 集 = { show_id: 1, air_date:2014/04/02 }
point.rb
class Point < ActiveRecord::Base
belongs_to :show
has_and_belongs_to_many :contestants, inverse_of: :points
before_destroy { contestants.clear }
has_and_belongs_to_many :episodes, inverse_of: :points
end
示例:point 1 = { event: 'Contestant gets in an argument', show_id: 1, points: 10 }
示例:point 2 = { event: '参赛者在第 7 集被淘汰', show_id: 1, points: 70 }
大难题:
我应该如何在所有三个模型之间建立关联以便我可以查询:
- 选手 A 在第 1 节比赛中得了多少分?
- 哪些参赛者在第 1 集中得分?
- 参赛者 A 在第 1-5 集之间得了多少分?
HABTM 是获得我想要的查询结果的正确方法吗?有没有更简单的方法来构建这三个模型?再次感谢您的帮助!
【问题讨论】:
-
谢谢,布拉德。一旦我很好地设置了我的模型,上面的答案肯定会帮助我查询,但我不清楚我应该如何构建我的模型和关联......将继续研究!
-
您应该将解决方案作为答案发布,而不是将其附加到您的问题中(然后在超时过后接受答案,而不是在问题中添加“已解决”)
-
感谢@FrederickCheung 的说明,我已根据您的建议进行了更新。这是我第一次发帖,非常感谢您的最佳实践!
标签: sql ruby-on-rails activerecord associations model-associations