Ruby on rails AR事务未按预期工作。第一条记录保存,第二条记录不保存';t、 但第一个记录不是';不要被摧毁

Ruby on rails AR事务未按预期工作。第一条记录保存,第二条记录不保存';t、 但第一个记录不是';不要被摧毁,ruby-on-rails,activerecord,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 = Ph

我正在尝试使用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
class Post
这里,照片是表单上传的文件,主体是字符串。如果传入的是照片,但不是正文字符串,则会创建照片,但不会创建帖子,但事务不会销毁照片


事务为什么不删除照片记录?

create
不会引发异常。这意味着
事务
块正常完成,从而提交其更改(不包括第二个
创建
块内部放弃的更改,但这些更改不会中止周围的事务)

要使其达到预期效果,最简单的方法是使用
create,如果无法创建和保留记录,则将引发


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

酷,我刚刚尝试了这个,它会按预期删除照片,但是由于引发了异常,我无法访问模型以便向用户显示错误,例如
发布错误。完整消息
。有没有办法做到这一点,或者最好只是手动检查
post.persistend?
,如果没有,则手动删除照片,而不是使用事务?这是“可选”的情况:您需要
transaction
来查看异常,但可以在周围的方法中拯救它。作为一种特殊情况,如果您提出
ActiveRecord::Rollback
,则
transaction
将自动为您解救它。