2

私の 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

projects_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)を使用しても、プロジェクトとすべてのタスクに対して個別にクエリを使用します。私は何かが欠けていますか?? 私はどこで間違いをしていますか?

4

1 に答える 1

2

このようなものを試すことができます。

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

次に、次の方法で合計にアクセスできます。

task["total"].to_i

これらのコードが機能するかどうかは保証できません。ただし、基本的な考え方は、テーブルを結合し、追加フィールドとして合計を選択することです。

于 2012-04-19T02:05:52.613 に答える