40531


ruby on railsで  
モデルに対して定時的な処理(rakeタスク）を書いているのですが、  
一斉に実行される処理の仕方がわからず困っています。

例えば、Accountモデルにはアカウント（レコード）が101件あり、  
それぞれのアカウントには数量残高が記録されています。  
例外（回収役となる1件アカウント）を除き、  
それぞれのアカウントの残高から１％の数量を算出して回収し、  
回収した数量とアカウントidを１つのレコード（取引記録）として、計100件のレコードを  
AccountTransaction（取引記録）モデルに記録（自動投稿）したいと思っています。

Accountモデル  
・id（主キー）  
・balance（残高数量）

AccountTransactionモデルには、  
・id(主キー）  
・amount(取引数量）  
・withdrawal_account_id（支払側の口座id)  
・deposit_account_id（回収役で受取側の口座id）

この場合、どのような実装をすれば実現できるのか教えて頂ければ幸いです。  
AccountTransaction側のモデルファイル

[code]

    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
    
[/code]

AccountTransaction側のモデルファイル

[code]

    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
    
[/code]

lib/tasksのrakeファイル。

[code]

    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
    
[/code]


CC BY-SA 3.0
2017-12-25T12:57:32.293
40528
2017-12-27T00:59:29.000
26666
question
ruby-on-rails ruby
railsで全てのアカウントに自動投稿を一斉に行わせたい


teratail の方の投稿も見ましたが、「一斉」や「一括」という単語でどのような操作を  
イメージしているのかが解りません。  
全体を一つの transaction にしておけば、各 Account について順次処理していくだけで  
良いのではないでしょうか。

試していないのでイメージですが、

[code]

    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
    
[/code]

という感じです。


CC BY-SA 3.0
2017-12-25T14:48:47.230
40531
2017-12-27T00:59:29.000
2017-12-27T00:59:29.000
26666
5288
40528
answer