1

私のアプリには次の設定があります。

class Account < ActiveRecord::Base
  attr_accessible :balance, :user_id
  belongs_to :user
end

class User < ActiveRecord::Base
  attr_accessible :name, :email
  has_one :account
end

口座を持っているユーザー (銀行の顧客など) がいる場所。アカウント A からアカウント B に資金を送金したい場合、Rails 3 でこれを行う正しい方法は何でしょうか?

次のように、ステートメント全体をトランザクション内にラップすることを考えていました。

ActiveRecord::Base.transaction do
  david.withdrawal(100)
  mary.deposit(100)
end

しかし、私たちには明らかではないのは、コントローラーで新しいメソッドを作成する必要があるかどうか、または....基本的にどのようにこれを達成するか、また、データベースの量を単に変更するメソッドを作成するか、または新しいメソッドを作成する必要があるかです.これを処理するコントローラーのメソッド。最も重要なことは、そのフォームがその特定のモデルのビュー構造に常にあるとは限らないことを考えると、フォームからモデルに正しい方法で変数を渡す方法です。

もう一度-多分これのための宝石がありますか?

4

2 に答える 2

4

これは投稿された同じコードmdepolliで、再編成されたものです

class Account < ActiveRecord::Base
  attr_accessible :balance, :user_id
  belongs_to :user

  def withdraw(amount)
    # ...
  end

  def deposit(amount)
    # ...
  end

  def self.transfer(from_account, to_account, amount)
    from_account.withdraw(amount)
    to_account.deposit(amount)
  end
end

コードの呼び出し (コントローラーのアクション?)

Account.transaction do
  Account.transfer(david, mary, 100.02)
end

お好みに応じて、転送メソッド内でトランザクション ブロックを開始することをお勧めします。私は通常、コントローラーのアクションに私のものを押し出します

これは、ハッシュを使用してわずかに変更されたバージョンであるため、呼び出し元のコードは順序付きパラメーターの代わりにキーを使用できます

  def self.transfer(args = {})
    from_account = args.fetch(:from)
    to_account = args.fetch(:to)
    amount = args.fetch(:amount)

    from_account.withdraw(amount)
    to_account.deposit(amount)
  end

  Account.transfer({ from: david, to: mary, amount: 100.02 })
于 2013-03-23T19:13:06.553 に答える
0

helpers/application_helper.rb

module ApplicationHelper
  def transfer(from_account, to_account, amount)
    from_account.withdraw(amount)
    to_account.deposit(amount)
  end
end

models/account.rb

class Account < ActiveRecord::Base
  def withdraw(amount)
    ...
  end

  def deposit(amount)
    ...
  end
end
于 2013-03-23T16:17:47.033 に答える