如何使用其他(相关)模型的属性连接模型(从子项绘制数据)

时间:2013-08-14 12:53:11

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

在使用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

2 个答案:

答案 0 :(得分:2)

“我如何绘制每位球员获得的分数?”

首先将此添加到用户:

has_many :levels, :through => :games

然后获得每位玩家的总得分:

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

“然后是每个游戏每个游戏获得的平均分数?”

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

这将返回一个哈希,其中元组(email,game_id)为关键,平均值为值。通过电子邮件分组只是为了能够在结果中获得一些用户身份识别,但应该有一种更好的方式来实现它。

答案 1 :(得分:0)

您可以使用包含

来加入表格
  

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

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

  

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