(更好)在before_create方法链中创建新模型的解决方案。

时间:2014-08-13 14:56:39

标签: ruby-on-rails activerecord ruby-on-rails-4 transactions associations

在我向您展示代码之前,让我快速解释一下:

  • 有3种型号:付款,发布和客户。
  • 客户has_many :payments,出版物has_one :payment和付款belongs_to两者
  • 通过其他模型发布has_one :user;)
  • 客户的字段balance代表资金/资金(如银行帐户)。余额必须 NOT 低于0。

现在(不是)的工作原理如下:

  • 控制器使用包含Publication.create
  • 之类的参数调用price
  • 调用before_create :create_payment内的方法Publication。此方法仅包含以下代码行:Payment.create(client: client, amount: price, publication: self)
  • 我们现在在Payment课内。在这堂课里面有before_create :update_client_balance。此方法调用client.balance + amount (金额代表价格),然后调用client.save
  • 现在我们转到Client模型,该模型应验证为balance numericality: { greater_than_or_equal_to: 0,
  • 如果余额低于0,则不应回滚所有操作。我的意思是PublicationPayment都应该创建,Client余额应保持不变。

问题出现在before_create :create_paymentPublication内。因此,为了正确关联,我需要将Publication.id发送到Payment模型。但是发送self现在似乎不起作用。更重要的是:在运行此代码时(依此类推Publication.create()),回调create_payment进入无限循环!付款从未创建过。

当我开始考虑时,我认为它不应该都发生在AR callbacks(应该吗?)。我开始考虑为它创建自定义service(普通的旧ruby对象),但我不确定。我试图在所有类之间保持最高的封装(他们应该全身心地关注自己[所以我想Publication应该要求Client平衡...... Client应该关心它在validate_numicality_of。])

问题是:在上述情况下,仍应坚持使用before_create吗?

  • 如果是的话,什么是使其发挥作用的最佳解决方案。
  • 如果没有什么是最好的地方和方法让它发挥作用?

0 个答案:

没有答案