Имя / тип класса Rails не работает для полиморфного has_many :через

StackOverflow https://stackoverflow.com/questions/2123479

Вопрос

У меня есть система выставления счетов, которая управляет дебетами и кредитами.В основном сумма счета получается из суммы его дебетования, а остаток определяется путем взятия суммы его кредитов и вычитания ее из общей суммы.

Я делаю это с четырьмя моделями.

  1. Счет-фактура
  2. Позиция кампании
  3. Дебетовый
  4. Кредит

Способ, которым это работает, заключается в использовании модели объединения (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 делает ли это в вашем классе:

  1. belongs_to :invoice создает метод invoice который ищет счета-фактуры таблица для записи, на которую ссылается invoice_id
  2. belongs_to :recordable, :polymorphic => true создает метод recordable который ищет recordable_type.underscore.pluralize таблица для записи, на которую ссылается recordable_id
  3. belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id" создает метод credit который выполняет поиск через реквизиты таблица для записи, на которую ссылается recordable_id.Обратите внимание, что recordable_type здесь игнорируется.
  4. то же самое относится и к belongs_to :debit соответственно.

Поскольку ваш LineItem может принадлежать только либо Кредитному или дебет нет смысла дополнительно декларировать эти ассоциации.Вы можете обратиться к ним через recordable ассоциация.

Другие советы

Счет-фактура.последний.кредиты << Кредит.новый

Это правильный способ присвоения ассоциаций Я в замешательстве относительно того, почему recordable_type его не забирают.

Хватаюсь за соломинку, но пробовали ли вы:

Invoice.last.credits << Credit.create(:value => 1, :date => Time.now, ...)

У меня лично были проблемы при использовании многотипных таблиц соединения "многие ко многим" в Rails, которые часто решались с помощью has_many_polymorphs плагин.

Извините, что это не дает прямого ответа на ваш вопрос.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top