mosowave

sinamon129による(主に)技術ブログ。Ruby,Ruby on Rails,Elasticsearchやその他について書きます。

rails で transaction内でnextしたらtransactionブロックを抜けただけだった話

タイトルが結論なんですが、つんだ話。

Railsで、

[1,2,3].each do |i|

  Hoge.transaction do
   何らかの処理
   next if Hoge.huga
  end
  
  p i
end

みたいなのを書いたとして、
例が適当すぎるけど、要はfor文の中に、transactionを書いて、
transaction内の処理の内容によっては、その後の処理をskipして次に行きたい場合ってのがあったんだけども、その場合にnextが効かないことに気づいた。

transactionはブロックなので、ここでかくnextはブロックを抜けてしまうっぽい。
nextで飛ばされるはずの、transactionブロック後のp i が実行されて、あれ?ってなって気づいた。


ブロックとクロージャーについて詳しく書いてある記事にお世話になった
Rubyの動かないコード (初級編) ブロックとクロージャの性質 - 主に言語とシステム開発に関して