2011-07-05 18 views
9

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).peopleWidget.find(n).aliens, pero en la actualidad estos dos métodos (.people y .aliens) regrese conjunto vacío [] porque grouper_type es siempre SentientBeing.

+0

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

+0

<3 votos a favor anónimos. – deefour

Respuesta

13

¿Ha intentado lo más simple: agregar :conditions al has_many :through s?

En otras palabras, algo como esto (en widget.rb):

has_many :people, :through => :widget_groupings, :conditions => { :type => 'Person' }, :source => :grouper, :source_type => 'SentientBeing' 
has_many :aliens, :through => :widget_groupings, :conditions => { :type => 'Alien' }, :source => :grouper, :source_type => 'SentientBeing' 

JamesDS es correcto lo que se necesita una unión - pero no está escrito aquí, ya que la asociación has_many :through ya lo está haciendo.

+0

Muchas gracias, esto es lo que estaba buscando. – deefour

Cuestiones relacionadas