У меня есть система выставления счета, которая управляет дебетами и кредитами. В основном сумма счета получена суммой ее дебетов, и баланс получен путем взятия суммы ее кредитов и вычитания ее против общей суммы.
Я делаю это с четырьмя моделями.
Путем это работает, с помощью модели соединения (Позиция), которая имеет полиморфную ассоциацию, названную записываемой. Все, кажется, работает правильно на первый взгляд. Однако осмотр позиции показывает, что, в то время как recordable_id обнаруживается хорошо, recordable_type является нолем.
Вот повреждение вниз кода:
class Invoice < ActiveRecord::Base
has_many :line_items, :dependent => :destroy
has_many :debits, :through => :line_items, :as => :recordable
has_many :credits, :through => :line_items, :as => :recordable
end
class LineItem < ActiveRecord::Base
belongs_to :invoice
belongs_to :recordable, :polymorphic => true
belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id"
belongs_to :debit, :class_name => "Debit", :foreign_key => "recordable_id"
end
class Credit < ActiveRecord::Base
has_many :line_items, :as => :recordable, :dependent => :destroy
end
class Debit < ActiveRecord::Base
has_many :line_items, :as => :recordable, :dependent => :destroy
end
Кто-либо может указать на меня в правильное направление здесь?
Вы объявляете неоднозначные ассоциации в своем классе LineItem
.
Вкратце, own_to
делает это в вашем классе:
own_to: invoice
создает метод invoice
, который выполняет поиск в таблице invoices . для записи, на которую ссылается invoice_id
own_to: recordable,: polymorphic => true
создает метод recordable
, который ищет в таблице recordable_type.underscore.pluralize
запись, на которую ссылается recordable_id
own_to: credit,: class_name => "Credit",: foreign_key => "recordable_id"
, создает метод credit
, который выполняет поиск по таблица кредитов для записи, на которую ссылается recordable_id
. Обратите внимание, что recordable_type
здесь игнорируется. own_to: debit
соответственно. Поскольку ваш LineItem может принадлежать только к аккредитиву или к дебету, нет смысла объявлять эти ассоциации дополнительно. Вы можете обратиться к ним через записываемую ассоциацию
.
SCOICE.LAST.CREDITS << CURDE.NEW
Это правильный способ присвоения ассоциаций, на которые я ошеломлен относительно того, почему Recordbable_Type
не поднимается.
сжимается на соломею здесь, но вы пробовали:
Invoice.last.credits << Credit.create(:value => 1, :date => Time.now, ...)
У меня лично были проблемы при использовании многоуровневых таблиц соединения многозначного соединения в рельсах, которые часто были разрешены с помощью HAS_MANY_POLYMORPHS
плагин.
Извините, что это не напрямую отвечает на ваш вопрос.