Подводя итог, глядя на связанный столбец - более простой способ? - PullRequest
0 голосов
/ 31 января 2019

У меня есть Project модель, которая has_many: Tasks каждая задача has_many :users, through: :userAssociations, поэтому один человек может работать над задачей, но в случае встречи или любого сотрудничества много пользователей могут работать над одной и той же задачей.

Задачи имеют столбец: t.integer "time", который позволяет пользователям указывать в минутах, сколько времени заняла задача.

В методе 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 голосов
/ 01 февраля 2019

Вы можете сделать это немного проще, поскольку у задачи много пользователей.Я думаю, что вы также можете использовать 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

Я бы не стал проверять счет> 1. Экономия на избавлении от умножения ничтожна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...