kjs*_*js3 11 activerecord transactions ruby-on-rails-4
如果一个人创建,为什么这个事务不会回滚!失败?如果它有任何区别,它在控制器中.
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
Run Code Online (Sandbox Code Playgroud)
我明确地发送一个包含一些不良记录的数组.好的是创建而坏的不是,但即使一个失败,我也需要全部回滚.
这是我的rspec测试(传递json数组照片)并且它正在递增.
expect { post :create, json }.not_to change(Photo, :count)
Run Code Online (Sandbox Code Playgroud)
kjs*_*js3 16
这只是rspec的测试问题,因为您已经在测试中的事务中执行了.这是与此处讨论的嵌套事务相同的问题.为了使测试工作,您需要添加...
requires_new: true
Run Code Online (Sandbox Code Playgroud)
到交易电话.
这修复了测试.
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
Run Code Online (Sandbox Code Playgroud)
重要说明:回滚仅在数据库引擎支持时才有效!例如,带有MyISAM的MySQL不支持事务,而带有Inno DB的MySQL确实支持它们.
归档时间: |
|
查看次数: |
2960 次 |
最近记录: |