Полиморфная ассоциация foreign_type устанавливает тип предка вместо текущего, используя класс STI

у меня есть

class Car < ActiveRecord::Base; end

class Porsche < Car
  has_many :page_items, :as=>:itemable, :dependent=>:destroy
end

Я должен упомянуть, что я использую одну таблицу с именем cars, в которой есть поле type.

class PageItem<ActiveRecord::Base
  belongs_to :itemable, :polymorphic=>true
end

Когда я делаю

  a = PageItem.new
  a.itemable = Porsche.new
  a.itemable
  #<Porsche id: nil, type: "Porsche", name: nil, ..etc>

  a.itemable_type
  => "Car"

И это должно быть

  a.itemable_type
  => "Porsche"

У кого-нибудь есть идеи по этому поводу?

Обновить

Согласно ответу bor1s, вероятно, это правильное поведение. Итак, если это так, то мой вопрос в том, как я могу установить его на Porsche неявно?




Ответы (2)


Это связано с тем, что Porshe является виртуальной моделью, ее на самом деле нет в базе данных, у нее просто есть поле type, чтобы знать, что это Porshe. Возможно, вам следует избавиться от STI и использовать, скажем, столбец type для сохранения модели автомобиля с типом Porshe и использовать scope для поиска porshes. Надеюсь, я вам немного помог.

person bor1s    schedule 18.08.2011
comment
Ну, я думаю, это цель наследования STI, чтобы использовать одну и ту же таблицу для хранения разных классов. - person dombesz; 18.08.2011

Я думаю, что если вы добавите поле type в таблицу Car, вы сможете получить тип Porsche, используя: PageItem.new(:itemable => Porsche.new).itemable.type

person BitOfUniverse    schedule 18.08.2011