Ruby on rails Run方法取决于调用它的模型或路径
我的应用程序中有Ruby on rails Run方法取决于调用它的模型或路径,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我的应用程序中有交易和账户模型交易属于:账户且账户有多个:交易 当用户创建交易时,应用程序使用 after_create :add_to_account 在Account模型中,我有after_update方法,但只有当用户自己更新帐户时,我才需要运行它,而不需要创建事务 因此,我需要运行此方法,仅当它是从accounts\u path调用时,或者除非它是从transactions\u path或Transaction模型调用时。如何使用if语句实现它 谢谢你的帮助 更新(如果有人有相同的问题
交易
和账户
模型<代码>交易属于:账户且账户有多个:交易
当用户创建交易时,应用程序使用
after_create :add_to_account
在Account
模型中,我有after_update
方法,但只有当用户自己更新帐户时,我才需要运行它,而不需要创建事务
因此,我需要运行此方法,仅当它是从accounts\u path
调用时,或者除非它是从transactions\u path
或Transaction
模型调用时。如何使用if语句实现它
谢谢你的帮助
更新(如果有人有相同的问题)
bbozo的方法可行,但可能我对问题的描述不清楚:在交易
中创建后的方法没有问题,问题是在账户
模型中更新
后的方法。因此,解决方案是:
class Account
attr_accessor :initiated_by_user
after_update :run_it_only_when_it_was_initiated_by_user
private
def run_it_only_when_it_was_initiated_by_user
if initiated_by_user
..
end
end
end
以及在账户\控制器中
def update
@account = current_user.accounts.find(params[:id])
@account.initiated_by_user = true
...
end
然后在控制器中
t = Transaction.new(params[:transaction].permit(foo etc etc))
t.initiated_by_user = true
#...
这是一个非常糟糕的设计:添加attr_访问器来尝试拆分逻辑菜单,因为您的代码迫切需要服务objects@apneadiving,我大致上同意,但在这种情况下,我不同意。如果您希望每次成员自己输入trx时都发生一些事情,那么该代码段最好放在模型中,然后放在服务类中。出于责任原因,金融交易设计推理会将该属性放在数据库中,而不是放在属性访问器中。OP只是从“我如何绕过这个”的角度来看待问题,但知道谁发起了交易的问题通常比简单的“我应该执行回调吗?”@apheading,但是是的,一旦控制器开始变大或特殊验证器开始出现,我会将控制器逻辑提取到一个表单类中,但我会将该模型作为财务逻辑的一部分保留在模型中,或在我的应用程序中非常接近它,我需要交易和账户协同工作,因此账户余额的每一次变化都必须有一笔交易,这就解释了这种变化。这对于金融应用程序逻辑是必要的。所以当用户创建事务时,它会更新帐户,但当用户自己更新帐户时,我需要创建事务,这解释了这种变化。这种逻辑形成了一个无限循环,创建新事务并更新它们的帐户。我需要打破这个循环,所以我需要告诉Rails不要创建“解释”事务,如果它已经存在的话。有更好的方法吗?您的因果逻辑不正确,交易需要是帐户余额变化的原因,而不是相反。基本上,您应该在事务的“创建后/保存后”上设置帐户余额更新,成员更新其余额的操作不应该是余额更新,而是导致余额更新的新事务,我可以理解吗?:)
t = Transaction.new(params[:transaction].permit(foo etc etc))
t.initiated_by_user = true
#...