En ActiveRecord, has_many :through, and Polymorphic Associations, el ejemplo de la OP peticiones como haciendo caso omiso de la posible superclase de Alien
y Person
(SentientBeing
). Aquí es donde radica mi pregunta.ActiveRecord, has_many: a través de, Asociaciones polimórficos con STI
class Widget < ActiveRecord::Base
has_many :widget_groupings
has_many :people, :through => :widget_groupings, :source => :person, :source_type => 'Person'
has_many :aliens, :through => :widget_groupings, :source => :alien, :source_type => 'Alien'
end
SentientBeing < ActiveRecord::Base
has_many :widget_groupings, :as => grouper
has_many :widgets, :through => :widget_groupings
end
class Person < SentientBeing
end
class Alien < SentientBeing
end
En este ejemplo modificado el valor grouper_type
para Alien
y Person
son ahora ambos almacenados por rieles como SentientBeing
(Rails busca la clase base para este valor grouper_type
).
¿Cuál es la forma correcta de modificar el has_many
en Widget
para filtrar por tipo en tal caso? Quiero ser capaz de hacer y Widget.find(n).people
Widget.find(n).aliens
, pero en la actualidad estos dos métodos (.people
y .aliens
) regrese conjunto vacío []
porque grouper_type
es siempre SentientBeing
.
Esta pregunta es muy similar a una [Publiqué antes] [1]. Es un problema interesante porque, como dijiste, el atributo 'grouper_type' solo almacena la superclase. Parece que lo que se necesita es una unión entre los widgets y las tablas sentient_beings. Una consulta más larga como la que uso probablemente funcione para usted, pero no es bonita, de ahí la razón por la que hice mi pregunta. [1]: http://stackoverflow.com/questions/6582588/rails-structuring-a-query-involving-a-polymorphic-association-and-sti – JamesDS
<3 votos a favor anónimos. – deefour