Rails has_many:通过“子对象”的sum属性 - > SQL Toughy

时间:2013-04-17 05:27:10

标签: ruby-on-rails activerecord

我有三个one-to-many关系,一个has_many :through关联和一个具有我想要求和的属性的对象。

这可能听起来很愚蠢,但假设例如以棒球为主题的应用程序:

:league has_many :teams 
:team has_many :users   
:league has_many :homeruns, :through => :users
:user has_many :homeruns 

我要做的是,在联盟show页面上列出相应team中的每个league,并在英尺 > homeruns 每个团队累积起来。 (Feethomerun上的属性。)

我现在最接近的是@league.homeruns.sum(:feet)(显示每个联盟的本垒打总距离),但我想在球队一级做到这一点,按联赛过滤。

有意义吗?任何帮助都将深表感谢。

1 个答案:

答案 0 :(得分:10)

如果您添加:team has_many :homeruns, through: :users,则可以使用team.homeruns.sum(:feet)获取每个团队的成绩,对吧?最好将其转换为team模型中的方法:

# team.rb
has_many: homeruns, through: :users

def total_homerun_distance
  self.homeruns.sum(:feet)
end

然后列出特定league的所有团队,只需遍历视图中属于该team的每个league,包含在您想要的任何HTML中。例如,要将其显示为表格:

# views/leagues/show.html.erb
<table>
<% @league.teams.each do |team| %>
  <tr>
    <td><%= team.name %></td>
    <td><%= team.total_homerun_distance %></td>
  </tr>
<% end %>
</table>