鸡肉和鸡蛋电子邮件

时间:2013-08-01 17:11:01

标签: mysql ruby-on-rails ruby-on-rails-3 email activerecord

以下是设置:

我的系统有很多帐户,每个帐户都有很多用户。系统超级用户可以向所有帐户广播消息。消息传递表示帐户和消息之间的连接。

消息after_create将为系统中的每个帐户生成一个消息。消息after_create将通过电子邮件将消息传递给该帐户的每个用户。电子邮件将包含一个链接,例如“点击此处阅读完整信息:http://example.com/messages/123

Rails似乎在内存中执行整个操作,然后在最后一步提交到数据库。大致是:

Message
  after_create
    create_messagings
      ...
      Messaging
        after_create
          send_email
            "click here! example.com/messages/123"

            ...

            commit to database

最终发生的事情是,电子邮件开始随邮件一起提供,但在最后一条邮件发送之前,该URL在数据库中尚不存在。

我不能成为第一个反对这个想法的人......任何想法?

目前这个应用程序正在使用Rails 3.0,如果这会产生影响。

1 个答案:

答案 0 :(得分:1)

尝试将Messaging.after_create更改为Messaging.after_commit

在提交交易后调用after_commit回调,这样可以确保Message&在触发Messaging方法之前,数据库中存在send_email个记录。