AR交易未按预期进行。保存第一条记录,第二条记录不保存,但是第一条记录没有被破坏

时间:2018-07-01 09:53:47

标签: ruby-on-rails activerecord

我正在尝试使用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

在这里,照片是表单中的上传文件,正文是字符串。如果传入照片而不是正文字符串,则表示正在创建该照片,但不创建该帖子,但是该事务不会破坏该照片

为什么交易不删除照片记录?

1 个答案:

答案 0 :(得分:0)

create不会引发异常。这意味着transaction块可以正常完成,并因此提交其更改(不包括第二个create内部放弃的更改-但不会中断周围的事务)。

执行此操作的最简单方法是使用create!,如果无法创建并持久保存记录,则会增加该值。

或者,您可以在create块末尾的transaction之后检查对象的状态,并在那里显式引发异常。