Имя / тип класса Rails не работает для полиморфного has_many: through - PullRequest
5 голосов
/ 23 января 2010

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

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

  1. Счет
  2. Позиция
  3. Дебет
  4. Кредит

Как это работает, это через модель соединения (Line Item), которая имеет полиморфную ассоциацию, называемую записываемой. На первый взгляд все работает правильно. Тем не менее, проверка позиции показывает, что хотя recordable_id отображается нормально, значение recordable_type равно nil.

Ниже приведен код:

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

Кто-нибудь может указать мне правильное направление здесь?

Ответы [ 2 ]

3 голосов
/ 28 января 2010

Вы объявляете неоднозначные ассоциации в своем классе LineItem.

В двух словах, belongs_to делает это в вашем классе:

  1. belongs_to :invoice создает метод invoice, который ищет в таблице invoices запись, на которую ссылается 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, который ищет в таблице credits запись, на которую ссылается recordable_id. Обратите внимание, что recordable_type здесь игнорируется.
  4. То же относится и к belongs_to :debit соответственно.

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

0 голосов
/ 24 января 2010

Invoice.last.credits << Credit.new </p>

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

Сжимая здесь соломинку, но вы пробовали:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...