2016-11-14 8 views
1
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 

最初のチケットが有効で、2番目のチケットが無効であるとします。このコードでは、最初のチケットが保存されます。しかし、1つ失敗したときにすべてのチケットをロールバックしたい。 どうすればいいですか?1つのオブジェクトがすべてのオブジェクトのロールバックに失敗した場合

+0

どのように働いていないということですか? – ndn

+0

コードを短縮することはできますが、うまくいくはずです。 – Stefan

+0

このコードの問題は、最初のチケットが保存されていることです。私は2つのチケットをロールバックしたい@ndn – lolix

答えて

0

あなたは、@ticket.saveの戻り値のコレクションを構築し、それらに.all?を呼び出し、そしてあなたが偽の昇給を取得する場合、ロールバックできます。

ActiveRecord::Base.transaction do 
    installations.each do |installation| 
    tickets_saved = [] 
    id = installation.id 
    installation = current_user.installations.find_by(:id=> id) 
    ticket = installation.tickets.new(ticket_params) 
    tickets_saved << ticket.save 
    end 

    unless tickets_saved.all? 
    raise ActiveRecord::Rollback 
    end 
end 
+0

これは、元のコードと同じことを行いますが、無効なチケットが見つかった後も残りの有効なチケットを保存しようとします。 –

+0

...うん、私の悪い:) – ttrmw

関連する問題