我的应用程序中有以下设置。
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
但我们不清楚的是,我们是否需要在控制器中创建新方法,或者....基本上你将如何实现这一点,你也会编写一个简单地改变数据库中数量的方法,或者应该我们在控制器中制作新方法来处理这个问题。最重要的是,如何以正确的方式将变量从表单传递到模型,给定,该表单不会始终位于该特定模型的视图结构中。
然后再说 - 也许有一个宝石?
答案 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