У меня есть 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
и повышение исключения.
Есть ли лучшее решение отказаться от ассоциации?