Rails:嵌套资源的第3级求和

时间:2012-04-18 13:33:22

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 nested sum

在我的rails 3.1应用程序中我有这些模型:

class Project < ActiveRecord::Base  
  has_many :tasks
  has_many :hours, :through => :tasks  

  def sum_hours
    self.hours.sum(:hours)
  end
end  

class Task < ActiveRecord::Base  
  belongs_to :project  
  has_many :hours 

  def sum_hours
    self.hours.sum(:hours)
  end 
end 

class Hour < ActiveRecord::Base  
  attr_accessible :hours     # column in table

  belongs_to :task  
end
project_controller.rb中的

def show
  @project = Project.find(params[:id])
  @tasks = @project.tasks.includes(:hours)
end

并在projects / show.html.erb中使用:

...
<td>Sum hours: <%= @project.sum_hours %></td>
...
<% for task in @tasks do %>
<tr>
  <td><%= task.sum_hours %></td>
</tr>
...

但即使使用 .includes(:hours),它仍然会分别为项目和每项任务使用查询。我错过了什么?我在哪里做错了???

1 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情,

@tasks = @project.tasks.joins(:hours).select("tasks.*, sum(hours) as total")

然后你可以通过

来访问总和
task["total"].to_i

我无法确保这些代码适合您。但基本的想法是加入表格并选择总和作为额外的字段。