Ruby on rails 跨多个模型观察条件

Ruby on rails 跨多个模型观察条件,ruby-on-rails,ruby,observer-pattern,modeling,Ruby On Rails,Ruby,Observer Pattern,Modeling,我正在构建一个用户可以管理事件的流程,具体操作如下: 登记与会者 附上照片 附上健身信息 目前,每种情况都发生在一个单独的控制器中,并且可以以任何顺序发生 完成这三个步骤后,我想向所有与会者发送一封电子邮件,其中包含照片链接等 我很难找到检查上述三种情况的最佳方法。目前,我正在通过创建一个名为GenerateeMailsToAttendeers的服务来实现这一目标,并提供了一个方法。这将检查条件,如果所有条件都满足,则生成电子邮件:例如: class GenerateEmailsToAtte

我正在构建一个用户可以管理事件的流程,具体操作如下:

  • 登记与会者
  • 附上照片
  • 附上健身信息
目前,每种情况都发生在一个单独的控制器中,并且可以以任何顺序发生

完成这三个步骤后,我想向所有与会者发送一封电子邮件,其中包含照片链接等

我很难找到检查上述三种情况的最佳方法。目前,我正在通过创建一个名为GenerateeMailsToAttendeers的服务来实现这一目标,并提供了一个方法。这将检查条件,如果所有条件都满足,则生成电子邮件:例如:

class GenerateEmailsToAttendees

  def try(event)
    if event.has_some_fitness_activities? and event.has_some_attendees? and event.has_some_photos?
      event.attendances.each do |attendance|
        attendance.notify_user_about_write_up
      end
    end
  end

end
现在的问题是,这一代邮件参与者分散在三个控制器上(AttendeesController#register、PhotoController#attach和FitnessInfoController#attach)。我还冒着向用户复制通知的风险

有更好的办法吗?我可以用一个观察员来观察这三个条件是否得到满足吗

如果模型结构有用,我可以提供更多信息


谢谢

将您的观察者移动到cron作业怎么样?i、 e:将它从所有三个控制器中移除,只需将它放在一个rake任务中,并安排它在满足条件的所有事件上每周/每天/小时等运行。如果电子邮件已经生成,您可能应该在事件上设置一个标志,这样您就不会向同一用户发送两次垃圾邮件。我知道这可能不是实时的,但它肯定会解决你的问题。我建议使用来管理您的cronjobs。

我会将其放入一个after_save回调:然后Rails会自动处理它。您可能需要一些系统来确保这种情况只发生一次。我会这样做:

  • 添加一个新的布尔字段,以跟踪事件是否已完成发送电子邮件所需的所有“工作”,例如“已发布”

  • 当发生可以使事件“已发布”的各种情况时,在事件模型中调用一个方法,该方法测试事件是否已准备好发布而当前未发布:如果已准备好,则更新要发布的模型并发送电子邮件

(我在这里猜测您的联接表名称)


现在你根本不需要在你的控制器里做任何事情。一般来说,我赞成尽可能保持控制器的绝对标准。

是的,您可以创建一个观察者,通过一个“after_save”回调来观察多个模型,方法如下

observe :account, :balance
def after_save(record)
  make your checks here
end
observe :account, :balance
def after_save(record)
  make your checks here
end