在我向您展示代码之前,让我快速解释一下:
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,
Publication
和Payment
都应该不创建,Client
余额应保持不变。问题出现在before_create :create_payment
类Publication
内。因此,为了正确关联,我需要将Publication.id
发送到Payment
模型。但是发送self
现在似乎不起作用。更重要的是:在运行此代码时(依此类推Publication.create()
),回调create_payment
进入无限循环!付款从未创建过。
当我开始考虑时,我认为它不应该都发生在AR callbacks
(应该吗?)。我开始考虑为它创建自定义service
(普通的旧ruby对象),但我不确定。我试图在所有类之间保持最高的封装(他们应该全身心地关注自己[所以我想Publication
应该要求Client
平衡...... Client
应该关心它在validate_numicality_of
。])
问题是:在上述情况下,仍应坚持使用before_create
吗?