如果一个人创建,为什么这个事务不会回滚!失败? 如果这有任何区别,它在控制器中。
def process_photos(photos)
ActiveRecord::Base.transaction do
begin
photos.each do |photo|
Photo.create!(creator_user: @user, buyer: @buyer, url: photo['url'])
end
rescue
raise ActiveRecord::Rollback
end
end
end
我明确发送一个包含一些不良记录的数组。好的是正在创建而坏的不是,但即使一个失败,我也需要全部回滚。
这是我的rspec测试(传递json数组照片)并且它正在递增。
expect { post :create, json }.not_to change(Photo, :count)
答案 0 :(得分:16)
这只是rspec的测试问题,因为您已经在测试中的事务中执行了。这是与here讨论的相同的嵌套事务问题。 为了使测试起作用,您需要添加...
requires_new: true
到交易电话。
这修复了测试。
def process_photos(photos)
ActiveRecord::Base.transaction(requires_new: true) do
begin
photos.each do |photo|
Photo.create!(creator_user: @user, buyer: @buyer, url: photo['url'])
end
rescue
raise ActiveRecord::Rollback
end
end
end
重要提示:只有数据库引擎支持回滚时,回滚才有效!例如,带有MyISAM的MySQL不支持事务,而带有Inno DB的MySQL确实支持它们。
答案 1 :(得分:0)
您需要像这样在代码块外开始
def process_photos(photos)
begin
ActiveRecord::Base.transaction do
photos.each do |photo|
Photo.create!(creator_user: @user, buyer: @buyer, url: photo['url'])
end
rescue
raise ActiveRecord::Rollback
end
end
end
答案 2 :(得分:0)
这也很好,不需要传播ActiveRecord :: Rollback异常。
def process_photos(photos)
begin
ActiveRecord::Base.transaction do
photos.each do |photo|
Photo.create!(creator_user: @user, buyer: @buyer, url: photo['url'])
end
end
rescue ActiveRecord::RecordInvalid
puts 'Transaction failed'
end
end