Rails AR - 验证连接表的父级具有相同的父级

时间:2015-08-11 18:30:34

标签: ruby-on-rails activerecord

我有以下课程:

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

我遇到了一些问题。

  1. 我在付款验证前调用payment_method.charge。 我可以通过在调用payment.process之前在payment_method.charge方法中明确调用self.validate来解决此问题,但这会导致下面的#2。
  2. 如果我尝试在付款对象上调用validate,我会收到异常,因为payment.order为零。订单尚未保存,因此尚未设置子对象(付款)内的引用。
  3. 似乎解决#2是最简单的解决方案。我不确定为什么从孩子(付款)到父母(订单)的引用没有设置。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我找到了自己问题的答案。我会把它留在这里,以防它可以帮助别人。

将此添加到我的Order类修复了问题:

has_many :payments, inverse_of: :order

似乎这应该是自动发生的,但显然不是。