如果条件不符合Rails 5 ActiveRecord条件关联,则belongs_to拒绝

问题描述 投票:1回答:1

我有2个型号:

class PaymentRequest < ApplicationRecord
  has_many :invoices, ->(request) { with_currency(request.amount_currency) }
end

class Invoice < ApplicationRecord
  belongs_to :payment_request, optional: true
  scope :with_currency, ->(currency) { where(amount_currency: currency) }
end

PaymentRequest可能只有相同货币的发票。它符合条件,而payment_request.invoices被称为。

我有不同的货币如下:

payment_request = PaymentRequest.create(id: 1, amount_currency: 'USD')
invoice = Invoice.create(amount_currency: 'GBP')

但是,如何拒绝以下?

# no validation here
payment_request.invoices << invoice

# the payment_request_id is set to 1
invoice.payment_request_id #=> 1

一种解决方案是添加has_many :invoices, before_add: :check_currency并引发异常。

拒绝关联是否有更好的解决方案?

ruby-on-rails activerecord ruby-on-rails-5 belongs-to
1个回答
0
投票

我实施了以下货币验证解决方案:

class PaymentRequest < ApplicationRecord
  has_many :invoices, ->(request) { with_currency(request.amount_currency) },
                      before_add: :validate_invoice

  monetize :amount_cents

  private

  def validate_invoice(invoice)
    raise ActiveRecord::RecordInvalid if invoice.amount_currency != amount_currency
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.