2017-08-14 89 views
0

所以我有这个配置的Rails:回滚所有交易如果失败

class Post < ActiveRecord::Base 
has_many :photo_albums 

class PhotoAlbum < ActiveRecord::Base 
has_many :photos 

,我想做到以下几点

@post = Post.new(post_params) 
@photo_album = @post.photo_albums.create(name: 'album name') 
@photo_urls = params[:photo_urls] 
@photo_urls.each do |pu| 
@photo_album.photos.create(url: pu) 
end 
@post.save 

现在我想的是,如果@ post.save失败那么photo_albums的所有交易,照片都应该回滚。

+0

使用'@'的post.photo_albums.new(...),而不是因为父母必须首先坚持创建。然后,只需在父文件('@ post')上调用'save',它就会触发'photo_album'的保存。 – MrYoshiji

回答

0

你可以,如果过滤器if @post.save添加和编写代码块创建photo_albumphotos只有当@post保存

@post = Post.new(post_params) 
if @post.save 
    @photo_album = @post.photo_albums.create(name: 'album name') 
    @photo_urls = params[:photo_urls] 
    @photo_urls.each do |pu| 
    @photo_album.photos.create(url: pu) 
    end 
else 
    # handle @post.save fail 
end 
+0

如果任何保存或创建失败,我实际上意味着回滚所有事务。 – user1670773

+0

为什么你想要回滚失败的事务,而不是跳过它..保存一堆数据库调用 – sa77