【问题标题】:How to join model with attribute of other (related) model (plotting data from child)如何将模型与其他(相关)模型的属性连接起来(从孩子绘制数据)
【发布时间】:2013-08-14 12:53:11
【问题描述】:

在使用 chartkick gem 的应用中:

我有以下数据库表关系:

class User < ActiveRecord::Base
  has_many :games
  contains id, email
end

class Game < ActiveRecord::Base
  has_many :levels
  belongs_to :user
  #contains id, user_id, name

  accepts_nested_attributes_for :levels
end

class Level < ActiveRecord::Base
  belongs_to :game
  #contains id, score and game_id
end

我如何绘制每个玩家获得的分数? 然后是每个玩家每场比赛的平均得分?

我想做这样的事情:

<%= column_chart Level.group(:user.email).sum(:score) %>

我设法做到了:

<%= column_chart Level.group(:game_id).sum(:score) %>

完整代码可以在here找到

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rails-models


    【解决方案1】:

    “我如何绘制每个玩家获得的分数?”

    首先将此添加到用户:

    has_many :levels, :through => :games
    

    然后得到每个玩家的总得分:

     User.includes(:levels).group(:email).sum(:score)
    

    “然后每个玩家每场比赛的平均得分?”

    User.includes(:levels).group(:email, :game_id).average(:score)
    

    这将返回一个以元组 (email, game_id) 作为键,以平均值作为值的哈希。通过电子邮件进行分组只是为了能够在结果中获取一些用户标识,但应该有更好的方法来做到这一点。

    【讨论】:

      【解决方案2】:

      您可以使用包含连接表,

      arel = Level.includes(:user, :game)

      然后根据需要使用适当的查询,

      arel = arel.group('user.email')

      【讨论】:

      • :user, :game 从未声明过它们是什么?
      • 您已经声明了两个模型,用户和游戏。 :user 和 :game 引用数据库中的表名。具体来说,我猜他们一定是用户和游戏。
      • 最后一行抛出:在级别上找不到名为“用户”的关联;也许你拼错了?
      • 首先,我建议您在操作中而不是在视图本身中执行此操作。
      • 其次,关卡模型中也必须有belongs_to :user。
      猜你喜欢
      • 2022-01-07
      • 2020-10-02
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多