Имя / тип класса Rails не работает для полиморфного has_many :через
-
22-09-2019 - |
Вопрос
У меня есть система выставления счетов, которая управляет дебетами и кредитами.В основном сумма счета получается из суммы его дебетования, а остаток определяется путем взятия суммы его кредитов и вычитания ее из общей суммы.
Я делаю это с четырьмя моделями.
- Счет-фактура
- Позиция кампании
- Дебетовый
- Кредит
Способ, которым это работает, заключается в использовании модели объединения (Line Item), которая имеет полиморфную ассоциацию, называемую recordable .На первый взгляд кажется, что все работает должным образом. Однако проверка элемента строки показывает, что, хотя 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
класс.
В двух словах, belongs_to
делает ли это в вашем классе:
belongs_to :invoice
создает методinvoice
который ищет счета-фактуры таблица для записи, на которую ссылаетсяinvoice_id
belongs_to :recordable, :polymorphic => true
создает методrecordable
который ищетrecordable_type.underscore.pluralize
таблица для записи, на которую ссылаетсяrecordable_id
belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id"
создает методcredit
который выполняет поиск через реквизиты таблица для записи, на которую ссылаетсяrecordable_id
.Обратите внимание, чтоrecordable_type
здесь игнорируется.- то же самое относится и к
belongs_to :debit
соответственно.
Поскольку ваш LineItem может принадлежать только либо Кредитному или дебет нет смысла дополнительно декларировать эти ассоциации.Вы можете обратиться к ним через recordable
ассоциация.
Другие советы
Счет-фактура.последний.кредиты << Кредит.новый
Это правильный способ присвоения ассоциаций Я в замешательстве относительно того, почему recordable_type
его не забирают.
Хватаюсь за соломинку, но пробовали ли вы:
Invoice.last.credits << Credit.create(:value => 1, :date => Time.now, ...)
У меня лично были проблемы при использовании многотипных таблиц соединения "многие ко многим" в Rails, которые часто решались с помощью has_many_polymorphs
плагин.
Извините, что это не дает прямого ответа на ваш вопрос.