Associações polimórficas e herança de tabela única

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 Persontudo funcionará perfeitamente. Mas tente adicionar uma imagem ao Celebritymodelo e de repente nada funciona mais. O que realmente acontecerá é que o imageable_typeserá definido como Celebrity, mas quando você quiser recuperar as Celebrityimagens de um modelo, o ActiveRecord consultará uma imagem com um imageable_typede Persone 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 …