我有一个Project
模型,其中每个任务has_many: Tasks
has_many :users, through: :userAssociations
个,因此一个人可以完成一项任务,但是在开会或进行任何协作的情况下,许多用户可以在同一项上工作任务。
任务具有一列:t.integer "time"
,该列允许用户在几分钟内说明任务花费的时间。
在Project的Show方法中,我希望能够对项目花费的总时间进行求和。
如果不是因为一个任务可以通过userAssociations模型拥有许多用户,我认为这很简单:@project.tasks.sum(:time)
,但是如果有多个用户正在处理该任务,那将不会重复计算时间。
自从最初发布此问题以来,我就可以使用此帮助程序:
def project_time_spent
@timeSum = 0;
@tasks.each do |tsk|
@userTask = UserTask.where(task_id: tsk.id);
if @userTask.count(:id) > 1
@timeSum += tsk.time * @userTask.count(:id)
else
@timeSum += tsk.time
end
end
return @timeSum
end
但是,这感觉不太“ Railsy”。是否有任何Rails专家建议采用更清洁的方法?我会错过一种简单的方法吗?
答案 0 :(得分:0)
由于任务有许多用户,因此您可以比执行此操作简单一些。我想您也可以在这里使用inject
。
def project_time_spent
@tasks.inject { |sum, tsk| sum + (tsk.time * tsk.users.count) }
end
您可以在Project
模型中包括一个实例方法:
def time_spent
self.tasks.inject { |sum, tsk| sum + (tsk.time * tsk.users.count) }
end
我不会费心检查count>1。省去乘积的节省很小。