принадлежат_отклонить, если условие не встречается в Rails 5 Условные ассоциации ActiveRecord - PullRequest
0 голосов
/ 26 января 2019

У меня есть 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 и повышение исключения.

Есть ли лучшее решение отказаться от ассоциации?

1 Ответ

0 голосов
/ 14 февраля 2019

Я реализовал следующее решение для проверки валюты:

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
...