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

助手/application_helper.rb

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

模型/account.rb

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

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