Ruby on rails 如果一个对象失败,将回滚所有对象
假设我们有两张票,第一张有效,第二张无效。在此代码中,将保存第一张票据。但我想在其中一张失败时把所有的票都退票。Ruby on rails 如果一个对象失败,将回滚所有对象,ruby-on-rails,ruby,Ruby On Rails,Ruby,假设我们有两张票,第一张有效,第二张无效。在此代码中,将保存第一张票据。但我想在其中一张失败时把所有的票都退票。 我该怎么做呢?你可以建立一个@ticket的集合。保存的返回值,调用.all?,如果得到一个false,则回滚: begin ActiveRecord::Base.transaction do installations.each do |installation| id = installation.id installation = curre
我该怎么做呢?你可以建立一个
@ticket的集合。保存的返回值,调用.all?
,如果得到一个false,则回滚:
begin
ActiveRecord::Base.transaction do
installations.each do |installation|
id = installation.id
installation = current_user.installations.find_by(:id=> id)
@ticket = installation.tickets.new(ticket_params)
unless @ticket.save
raise ActiveRecord::Rollback
end
end
end
redirect_to '/tickets', notice: "done"
rescue ActiveRecord::Rollback
render action: "new", notice: "problem" and return
end
ActiveRecord::Base.transaction do
安装。每个do |安装|
已保存的票子=[]
id=安装。id
installation=当前用户。installations.find\u by(:id=>id)
票证=安装。票证。新(票证参数)
保存的票证\u您可以构建一个@ticket的集合。保存的返回值,调用.all?
,如果出现错误,则回滚:
begin
ActiveRecord::Base.transaction do
installations.each do |installation|
id = installation.id
installation = current_user.installations.find_by(:id=> id)
@ticket = installation.tickets.new(ticket_params)
unless @ticket.save
raise ActiveRecord::Rollback
end
end
end
redirect_to '/tickets', notice: "done"
rescue ActiveRecord::Rollback
render action: "new", notice: "problem" and return
end
ActiveRecord::Base.transaction do
安装。每个do |安装|
已保存的票子=[]
id=安装。id
installation=当前用户。installations.find\u by(:id=>id)
票证=安装。票证。新(票证参数)
tickets\u saved这怎么不起作用?虽然您的代码可以缩短,但应该可以正常工作。此代码中的问题是第一张ticket已保存!我想回滚两个票证@ndn不完全确定,但我相信这是ActiveRecord::rollback异常的一个属性。。它的行为与其他异常不同,只回滚一个故障,而不是整个事务。如果您执行@ticket.save!而不是除非块!,“!”将引发一个异常(而不是回滚),该异常将丢弃整个事务。这是怎么不起作用的?虽然您的代码可以缩短,但应该可以正常工作。此代码中的问题是保存了第一个票证!我想回滚两个票证@ndn不完全确定,但我相信这是ActiveRecord::rollback异常的一个属性。。它的行为与其他异常不同,只回滚一个故障,而不是整个事务。如果您执行@ticket.save!而不是除非块!,“!”将引发一个异常(而不是回滚),该异常将丢弃整个事务。此操作与原始代码的操作相同,只是在找到无效的票据后仍将尝试保存剩余的有效票据…是的,我的错误:)此操作与原始代码的操作相同,除了在发现无效票证后仍会尝试保存剩余的有效票证……是的,我的错:)