我正在尝试使用AR事务来确保两个记录都创建,或者两个都没有创建。我有一个照片模型,还有一个拍照片的邮政模型。我想创建两者,或者都不创建。我的代码如下:
class Post < ActiveRecord::Base
validates :photo, :body, presence: true
def self.create_from_upload(photo: nil, body: nil)
self.transaction do
photo = Photo.create(photo: photo)
post = Post.create(photo: photo, body: body)
end
post
end
end
在这里,照片是表单中的上传文件,正文是字符串。如果传入照片而不是正文字符串,则表示正在创建该照片,但不创建该帖子,但是该事务不会破坏该照片
为什么交易不删除照片记录?
答案 0 :(得分:0)
create
不会引发异常。这意味着transaction
块可以正常完成,并因此提交其更改(不包括第二个create
内部放弃的更改-但不会中断周围的事务)。
执行此操作的最简单方法是使用create!
,如果无法创建并持久保存记录,则会增加该值。
或者,您可以在create
块末尾的transaction
之后检查对象的状态,并在那里显式引发异常。