我有以下课程:
class Account
has_many :payment_methods
has_many :orders
class PaymentMethod
belongs_to :account, inverse_of: :payment_methods
has_many :payments
class Order
belongs_to :account, inverse_of: :orders
has_many :payments
class Payment
belongs_to :order, inverse_of: :payments
belongs_to :payment_method, inverse_of: :payments
我有一张订单,可以在孩子时间付款。该付款还具有关联的payment_method。想法是下订单将构建订单和付款对象,订单将调用payment.process(下方),付款将在payment_method对象上调用收费方法,如果全部通过,则付款和订单将被保存。还在我身边吗?
好的,所以我需要在付款级别验证订单和payment_method都有相同的父(帐户),否则它需要验证失败而不是尝试处理。我在付款类中有这种方法:
def process
charge = payment_method.charge amount
self.is_paid = true
self.transaction_id = charge.id
rescue Exception => e
# handle exception
end
这个验证:
def payment_method_belongs_to_account
if payment_method and payment_method.account != order.account
# add error
end
end
我遇到了一些问题。
payment.process
之前在payment_method.charge
方法中明确调用self.validate来解决此问题,但这会导致下面的#2。validate
,我会收到异常,因为payment.order
为零。订单尚未保存,因此尚未设置子对象(付款)内的引用。似乎解决#2是最简单的解决方案。我不确定为什么从孩子(付款)到父母(订单)的引用没有设置。有什么建议吗?
答案 0 :(得分:0)
我找到了自己问题的答案。我会把它留在这里,以防它可以帮助别人。
将此添加到我的Order类修复了问题:
has_many :payments, inverse_of: :order
似乎这应该是自动发生的,但显然不是。