проблема с has_and_belongs_to_many и after_save

#ruby-on-rails

#ruby-on-rails

Вопрос:

У меня есть две модели

 class Payment < ActiveRecord::Base
  has_and_belongs_to_many :invoices

  after_save :update_invoices_state

  def update_invoices_state
    self.invoices.each{|i| i.update_state }
  end
end

class Invoice < ActiveRecord::Base
  has_and_belongs_to_many :payments

  def pending_value
    paid_value = Money.new(0,self.currency)
    self.payments.each{|payment| paid_value  = payment.value}
    self.value - paid_value
  end

  def update_state
    if self.pending_value.cents >= 0
      if self.due_on >= Time.zone.today
        new_state = :past_due_date
      else
        new_state = :pending
      end
    else
      new_state = :paid
    end
    self.update_attribute :state, new_state
  end
end
  

Я отлаживал это и обнаружил, что при запуске invoice.update_state self.payments выполняется пустой. Похоже, HABTM еще не обновлен.

Как я мог это решить?

Комментарии:

1. Как вы создаете или обновляете платеж и счета-фактуры?

2. Я решил ее с помощью validate:invoices_are_of_this_account, :after_add => :update_invoice_state, :after_remove =>:update_invoice_state по какой-то причине в этом случае связь обновляется

3. Я использовал Payment.create(…, :invoices => [..], …)

4. Если вы решили свою проблему, пожалуйста, подумайте о том, чтобы ответить на ваш вопрос: meta.stackexchange.com/questions/44693 /…

Ответ №1:

Я полагаю, что HABTM был в основном заменен на has_many: through .

Вы бы создали модель объединения, что-то вроде «InvoicePayment» (или что-то еще творческое)

 class Payment < ActiveRecord::Base
    has_many :invoice_payments
    has_many :invoices, :through => :invoicepayments
end

class InvoicePayment < ActiveRecord::Base
    belongs_to :invoice
    belongs_to :payment
end

class Invoice < ActiveRecord::Base
    has_many :invoice_payments
    has_many :payments, :through => :invoice_payments 
end
  

Это должно решить вашу проблему.