質問: ruby on railsで モデルに対して定時的な処理(rakeタスク)を書いているのですが、 一斉に実行される処理の仕方がわからず困っています。 例えば、Accountモデルにはアカウント(レコード)が101件あり、 それぞれのアカウントには数量残高が記録されています。 例外(回収役となる1件アカウント)を除き、 それぞれのアカウントの残高から1%の数量を算出して回収し、 回収した数量とアカウントidを1つのレコード(取引記録)として、計100件のレコードを AccountTransaction(取引記録)モデルに記録(自動投稿)したいと思っています。 Accountモデル ・id(主キー) ・balance(残高数量) AccountTransactionモデルには、 ・id(主キー) ・amount(取引数量) ・withdrawal_account_id(支払側の口座id) ・deposit_account_id(回収役で受取側の口座id) この場合、どのような実装をすれば実現できるのか教えて頂ければ幸いです。 AccountTransaction側のモデルファイル ``` class Account < ApplicationRecord belongs_to :user has_many :withdrawal_account_transaction, class_name: 'AccountTransaction', :foreign_key => 'withdrawal_account_id' has_many :deposit_account_transaction, class_name: 'AccountTransaction', :foreign_key => 'deposit_account_id' end ``` AccountTransaction側のモデルファイル ``` class AccountTransaction < ApplicationRecord belongs_to :withdrawal, class_name: 'Account', :foreign_key => 'withdrawal_account_id' belongs_to :deposit, class_name: 'Account', :foreign_key => 'deposit_account_id' end ``` lib/tasksのrakeファイル。 ``` namespace :currency_cycle do desc "全アカウント残高から一斉回収" task :cycle => :environment do begin ActiveRecord::Base.transaction{ #取引アカウントにレコードを一括作成(実験中) AccountTransaction.where.not(id: 19).create( deposit_account_id: 19,#回収役の口座id、固定なので直接idを記入している withdrawal_account_id: ?????????????", amount: ??????????? ) } end end end ```
回答: teratail の方の投稿も見ましたが、「一斉」や「一括」という単語でどのような操作を イメージしているのかが解りません。 全体を一つの transaction にしておけば、各 Account について順次処理していくだけで 良いのではないでしょうか。 試していないのでイメージですが、 ``` ActiveRecord::Base.transaction do # 回収側の取得 deposit_account = Account.find(19) # 各支払い側について Account.order(:id).each do |account| # account が回収側なら何もしない next if account.id == deposit_account.id # 支払額計算 (1%) amount = account.balance / 100 # この支払いについて AccountTransaction のレコードを作成 AccountTransaction.create!( withdrawal_account_id: account.id, deposit_account_id: deposit_account.id, amount: amount) # 残高を減額 account.balance -= amount account.save! end end ``` という感じです。