2010-08-15 14 views
5

Tengo un objeto principal, Publicación, que tiene los siguientes elementos secundarios.Asociaciones polimórficas inversas

has_one :link 
has_one :picture 
has_one :code 

Estos niños son mutuamente exclusivos.

¿Hay alguna manera de usar asociaciones polimórficas en reversa para que no tenga que tener los campos link_id, picture_id y code_id en mi tabla de publicaciones?

+0

¿Tendría sentido que la foto tenga una relación: has_many? Entonces podrías hacer lo que estás buscando ... – Trip

Respuesta

0

Creo que está buscando la opción :as para has_one. Le permite especificar el nombre del extremo de la asociación belongs_to.

Cuando todo lo demás falla, lea la documentación: http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

+0

Tal vez me esté perdiendo algo, pero ¿cómo crearía una asociación dinámica con un niño usando: as? Entiendo el polimorfismo con respecto a cómo un objeto hijo podría tener cualquier tipo de objeto principal. Pero lo que estoy preguntando es cómo un objeto padre puede tener cualquier tipo de objeto hijo. Quiero hacer algo como @ post.postable y obtener el objeto hijo, que sería uno de enlace, imagen o código. –

0

¿Hay una manera de utilizar polimórficos asociaciones en sentido inverso para que no tiene que tener link_id, picture_id, y los campos en code_id mi ¿Mesa del poste?

has_one implica que la clave externa se encuentra en la otra mesa. Si realmente ha definido su modelo de esta manera, entonces no tendrá link_id, picture_id y code_id en su tabla de publicaciones. Creo que quisiste decir belongs_to.

quiero hacer algo como @ post.postable y obtener el objeto secundario , lo que sería una de enlace, imagen, o el código.

creo que usted puede hacer esto mediante el uso de las ITS y la combinación de los links, pictures y codes tablas, y luego probar el tipo de modelo cuando se recuperan. Sin embargo, eso parece kludgey, y podría terminar con muchas columnas sin usar.

¿Hay alguna razón para no almacenar las columnas de Id. No utilizadas, aparte de ahorrar espacio? Si usted está dispuesto a mantenerlos, entonces se podría definir un atributo virtual y una columna postable_type: (código no probado, puede fallar espectacularmente)

def postable 
    self.send(self.postable_type) 
end 

def postable=(p) 
    self.send(postable_type.to_s+"=",p) 
end 
+0

Estoy buscando una forma más elegante de hacer las cosas que tener múltiples columnas _ _id. Aunque como este hilo está probando, el enfoque de columnas múltiples * _id es probablemente el más simple y el mejor. –

Cuestiones relacionadas