【问题标题】:Setting up and querying ActiveRecords associations between THREE models设置和查询三个模型之间的 ActiveRecords 关联
【发布时间】:2014-08-29 05:12:02
【问题描述】:

我是新晋 Rails“开发者”,这是我的第一个 StackOverflow 问题(耶!)。我正在构建一个应用程序(用于我的班级期末项目),它允许用户通过预测给定电视节目的活动和事件来赚取积分。到目前为止玩得很开心,但是,在构建定义以下模型之间关联的最佳方法时遇到了麻烦。

我研究了三个模型之间的三向关联,但大多数答案(例如 How to query across three modelsRight 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


【解决方案1】:

我正在经历这一集 -> 参赛者 -> 积分示例,以使答案简短明了。

首先一些建议:当您在处理活动记录时遇到任何问题时,请跳至rails console

现在你已经提到,参赛者 belongs_to :show 还有剧集 belongs_to :show

要支持这些关系,show_id 必须同时出现在 contestantsepisodes 表中。这就是 Rails 维护协会的方式。因此,每次您创建参赛者或剧集时,您还将与他们一起传递节目 ID。

假设显示 ID 为 1。 那么,

show = Show.find 1

现在访问该节目的所有参赛者或剧集:

show.contestants 
# => returns all contestants for show 1
show.episodes
# => returns all episodes for show 1

现在回到你的问题:

棘手的部分是每个参赛者可以在一个 给定的情节。我想做的是记录每个点 参赛者每集获得的收入,然后在我需要时查询 为用户计算积分。

如果我是正确的,分数将由参赛者计分。所以你的关系在那里不正确: 点belongs_to :contenstant

继续前进,因为积分属于参赛者,所以在您的points 表格中将有参赛者 ID 列,这也是保持关系的方式。

让我们创建一个参赛者。

contestant = Contestant.create(name, attributes, show_id, episode_id) # as episode has many contestant 
# => returns contestant

现在创建剧集

episode = Episode.create(name, attributes, show_id)
# => returns episode

查看该剧集的所有参赛者:

episode.contestants

为参赛者创造积分:

point = Point.create(value, contestant_id)

参赛者的接入点

contenstant.points 

现在回到原点。

point.contestant
#=> returns contestant to whom it belong

point.contestant.episode 
#=> returns episode in which it was scored

point.contestant.show 
#=> returns the show that point belongs to

PS:这是一个很长的答案,所以即使我试图保持专注,我也可能在中间迷失了方向,如果是这样的话,我会澄清那个特别的事情。

【讨论】:

  • 谢谢@shivam!我在这里看到的一个问题是参赛者可以上/有很多剧集,但我正在玩弄你建议的结构。我现在正在玩它,会让你知道我卡在哪里!
【解决方案2】:

听起来你需要一集才能通过该集的参赛者获得很多分数。

参赛者有积分,剧集有参赛者。从一集获得该集的分数的方法是通过参赛者。

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    当前解决方案

    我的一位才华横溢的同学建议我将点视为事件的实例,并将 Point 类重命名为 Event,然后创建新的 Point em> 类,具有 contestant_id、episode_idevent_id

    属性
    class Event < ActiveRecord::Base
        belongs_to :franchise, inverse_of: :events
        has_many :points
        has_many :contestants, through: :points
        has_many :episodes, through: :points
    end
    
    class Point < ActiveRecord::Base
        belongs_to :contestant
        belongs_to :episode
        belongs_to :event
    end
    

    现在我可以在控制台中运行以下查询:

    > Contestant.first.points
    => # [Point1, Point2, Point3]
    > Contestant.first.events
    => # [Event1, Event2, Event3]
    

    现在我可以轻松访问实际的积分分配。非常容易重组,对我的其他 10 个模型进行了最少的更新。谢谢Allen Hsu!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2017-06-15
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多