Se você quiser usar associações polimórficas em seus modelos STI, certifique-se de dizer ao modelo polimórfico para armazenar o tipo de base como o tipo do modelo pertencente e não o tipo real.
Exemplo:
class Person < ActiveRecord::Base
has_many :images, as: :imageable
end
class Celebrity < Person
end
class Image < ActiveRecord::Base
belongs_to :imageable, polymorphic: true
end
Agora, se você adicionar uma imagem a Person
tudo funcionará perfeitamente. Mas tente adicionar uma imagem ao Celebrity
modelo e de repente nada funciona mais. O que realmente acontecerá é que o imageable_type
será definido como Celebrity
, mas quando você quiser recuperar as Celebrity
imagens de um modelo, o ActiveRecord consultará uma imagem com um imageable_type
de Person
e que simplesmente não existe.
Como dito acima, para consertar isso, você deve sempre armazenar a classe base como imageable_type, que pode ser aconselhado da seguinte forma:
class Image < ActiveRecord::Base
belongs_to :imageable, polymorphic: true
def imageable_type=(sType)
super(sType.to_s.classify.constantize.base_class.to_s)
end
end
Leia mais sobre isso na API Rails .
Por que isso não funciona fora da caixa está além de mim …