Шаблон проектирования: агрегатное состояние для родителя из дочерних состояний в Rails - PullRequest
0 голосов
/ 24 октября 2011

У меня есть модель Meeting, в которой много участников. Каждый участник может предпринять несколько действий против Собрания (зарегистрироваться, принять, отклонить и т. Д.). Статус собрания (ожидающий, подтвержденный и т. Д.) Зависит от последних действий каждого участника и его собственных атрибутов (срок действия истек и т. Д.)

Например, если все участники примут, то статус встречи будет «подтвержден». Однако, если после подтверждения встречи один из участников предлагает новое время (из-за конфликта времени), тогда собрание становится «ожидающим».

Как мне смоделировать состояние в Meeting? Должен ли я сериализовать (т.е. создать столбец latest_state в таблице событий) текущее состояние? Если да, то как я могу использовать конечный автомат, основанный на действиях дочерних объектов?

Спасибо.

1 Ответ

0 голосов
/ 24 октября 2011

Вероятно, лучшим решением было бы инициировать обновление статуса собрания при обновлении модели участника:

class Participant < ActiveRecord::Base
  belongs_to :meeting
  after_update :update_meeting_after_change

  def update_meeting_after_change
    self.meeting.update_status if self.status_changed?
  end
end

class Meeting < ActiveRecord::Base
  has_many :participants

  def update_status
    #logic here
  end
end

self.status_changed? вернет true, если атрибут Participant status изменился во время обновления

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