通过查看关联的列来节省时间-一种更简单的方法?

时间:2019-01-31 11:42:15

标签: ruby-on-rails activerecord

我有一个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专家建议采用更清洁的方法?我会错过一种简单的方法吗?

1 个答案:

答案 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。省去乘积的节省很小。