Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如果一个对象失败,将回滚所有对象_Ruby On Rails_Ruby - Fatal编程技术网

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!而不是除非块!,“!”将引发一个异常(而不是回滚),该异常将丢弃整个事务。此操作与原始代码的操作相同,只是在找到无效的票据后仍将尝试保存剩余的有效票据…是的,我的错误:)此操作与原始代码的操作相同,除了在发现无效票证后仍会尝试保存剩余的有效票证……是的,我的错:)