Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rails 7.2 のリリースノートを見て思ったこと

uvb_76
November 12, 2024

Rails 7.2 のリリースノートを見て思ったこと

uvb_76

November 12, 2024
Tweet

More Decks by uvb_76

Other Decks in Technology

Transcript

  1. (Rails 7.1)こんなコードがあるとして class UserJob < ApplicationJob queue_as :default def perform(id)

    User.find(id) # ---------- これ、どうなる? end end User.transaction do user = User.create! UserJob.perform_later(user.id) end 4
  2. Rails 7.1 class UserJob < ApplicationJob queue_as :default def perform(id)

    User.find(id) # ---------- これ、どうなる? end end User.transaction do user = User.create! UserJob.perform_later(user.id) end コミット前にUserJob内でfindされてRecordNotFoundが発生する(可能性がある) 5
  3. Rails 7.2 Release Notes Now Active Job will automatically defer

    the enqueuing to after the transaction is committed, and drop the job if the transaction is rolled back. https://guides.rubyonrails.org/7_2_release_notes.html#prevent-jobs-from-being- scheduled-within-transactions 7
  4. Rails 7.2 では class UserJob < ApplicationJob queue_as :default def

    perform(id) User.find(id) # コミット後に実行されることが保障されて最高 end end User.transaction do user = User.create! UserJob.perform_later(user.id) # コミットされるまでエンキューが遅延される end 8
  5. Rails 7.2 では class UserJob < ApplicationJob queue_as :default self.enqueue_after_transaction_commit

    = :never # ++ オプションがある def perform(id) User.find(id) end end User.transaction do user = User.create! UserJob.perform_later(user.id) # いままでどおり即時エンキュー end 9
  6. 手札 今までどおり外に出すを徹底する User.transaction do @user = User.create! end UserJob.perform_later(@user.id) コールバックを明示する

    User.transaction do @user = User.create! transaction.after_commit do UserJob.perform_later(@user.id) end end 18
  7. Cop 10秒クッキング できた https://gist.github.com/ikaruga777/b8b637f8db25a4d6ec8a4e40753fbc05 $ rubocop example.rb Inspecting 1 file

    C Offenses: example.rb:2:3: C: ActiveJob/PerformInTransactions: トランザクションの中でperform_laterすなー Job.set(:wait_until).perform_later ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ example.rb:9:7: C: ActiveJob/PerformInTransactions: トランザクションの中でperform_laterすなー SomeJob.perform_later(id) # Copが警告を出す ^^^^^^^^^^^^^^^^^^^^^^^^^ 1 file inspected, 2 offenses detected 23
  8. おまけ これの実装 ARに after_all_transactions_commit というコールバックが増えた https://github.com/Shopify/rails/blame/main/activerecord/lib/active_record.rb#L514-L545 ジョブをエンキューする時に、設定が有効だったら after_all_transactions_commit に登 録するってことをしている

    https://github.com/Shopify/rails/blob/main/activejob/lib/active_job/enqueue_after_transac tion_commit.rb https://github.com/Shopify/rails/blob/1b4c73e2a17e592b007e00f083ef4f9b0703ebcf/a ctivejob/lib/active_job.rb#L42 27