Как автоматически обновить родителя после выполнения условия? - PullRequest
0 голосов
/ 21 мая 2018

Я хочу сделать так, чтобы после того, как все задачи проекта будут помечены как выполненные, мой проект автоматически изменится с not_completed на завершенный.Я сделал метод работы, но он очень неэффективен.

def project_toggle
  @projects_ids = Project.pluck(:id)
  @projects_ids.each do |cond|
    if Task.find_project_tasks(cond).pluck(:task_status).include?('not_complete')
      Project.find(cond).update(project_status: :'not complete')
    else
      Project.find(cond).update(project_status: :complete)
    end
  end
end

После этого я использовал joins и его способ более эффективен, но я не знаю, как сделать его завершенным проектом, потому что он отображается только если всестатус ложный.

Project.joins(:tasks).where(tasks: { task_status: false }).where(user_id: current_user)

1 Ответ

0 голосов
/ 21 мая 2018

Насколько я понимаю, вы пытаетесь отметить, что родитель (Project) завершен, когда все дочерние элементы (Task s) заполнены.Мне приходилось делать это много раз, но эта логика принадлежит модели вместо контроллера.

Если у вашего Task есть логический атрибут с именем complete, Rails автоматически сгенерирует complete?метод (обратите внимание на знак вопроса).

Просто добавьте метод complete? в ваш проект, который проверяет, все ли задачи complete?.

class Project < ApplicationRecord`

  ...

  # Have all tasks been completed?
  def complete?
    tasks.all? { |t| t.complete? }
  end

  ...

end

Затем, чтобы убедиться, что вашпроект завершен, просто запустите project.complete?

Это лучше, чем добавить столбец в вашу таблицу projects, потому что вы не хотите дублировать данные.Вы можете сделать вывод, что из данных tasks уже завершено project, и таким образом вы не рискуете, если таблица projects будет случайно не синхронизирована с заданиями.Особенно, если вы пометили проект как завершенный, а затем добавили задачу позже.

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