在Rails 3中的模型之间传输值的正确方法是什么?

时间:2013-03-23 15:56:10

标签: ruby-on-rails model transactions associations

我的应用程序中有以下设置。

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

但我们不清楚的是,我们是否需要在控制器中创建新方法,或者....基本上你将如何实现这一点,你也会编写一个简单地改变数据库中数量的方法,或者应该我们在控制器中制作新方法来处理这个问题。最重要的是,如何以正确的方式将变量从表单传递到模型,给定,该表单不会始终位于该特定模型的视图结构中。

然后再说 - 也许有一个宝石?

2 个答案:

答案 0 :(得分: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 })

答案 1 :(得分: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