Tengo publicaciones que los usuarios envían a otros usuarios. Hay dos modelos -: poste y: usuario, y: post tiene las siguientes asociaciones con nombre:rails find: uso de las condiciones al incluir la misma tabla dos veces a través de diferentes asociaciones con nombre
belongs_to :from_user, :class_name => "User", :foreign_key => "from_user_id"
belongs_to :to_user, :class_name => "User", :foreign_key => "to_user_id"
Ambos: usuario y: poste tiene columna "is_public", lo que indica que, o bien un solo puesto y/o la totalidad el perfil de usuario puede ser público o privado.
Mi objetivo es obtener una lista de publicaciones que son públicas Y cuyos destinatarios tienen perfiles públicos. Al mismo tiempo, me gustaría "incluir" tanto la información del remitente como la del destinatario para minimizar el número de llamadas de DNS. El desafío es que efectivamente estoy "incluyendo" la misma tabla dos veces a través de las asociaciones nombradas, pero en mis "condiciones" necesito asegurarme de que solo filtre por la columna "is_public" del destinatario.
no puede hacer lo siguiente porque "condiciones" no acepta un nombre de asociación como un parámetro:
Post.find(:all, :include => [ :to_user, :from_user ],
:conditions => { :is_public => true, :to_user => { :is_public => true }})
Por lo tanto, de una manera que puedo lograr esto es haciendo un adicional de "unirse" en el tabla "usuarios":
Post.find(:all, :include => [ :to_user, :from_user ],
:joins => "inner join users toalias on posts.to_user_id = toalias.id",
:conditions => { :is_public => true, 'toalias.is_public' => true })
¿hay una, tal vez más limpio, mejor manera de hacer esto?
Gracias de antemano
¿Estás en Rails3 o aún en 2.3.x? –
aún en 2.3.Me encantaría ver una solución para ambos – avioing