以下是设置:
我的系统有很多帐户,每个帐户都有很多用户。系统超级用户可以向所有帐户广播消息。消息传递表示帐户和消息之间的连接。
消息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,如果这会产生影响。
答案 0 :(得分:1)
尝试将Messaging.after_create
更改为Messaging.after_commit
。
在提交交易后调用after_commit
回调,这样可以确保Message
&在触发Messaging
方法之前,数据库中存在send_email
个记录。