#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
Это должно решить вашу проблему.