2011-01-04 11 views
5

Estoy tratando de recuperar un objeto activerecord de mi db. Mis modelos sonactiverecord find a través de la asociación

class User < ActiveRecord::Base 
    belongs_to :account 
    has_many :domains, :through => :account  
end 

Y

class Account < ActiveRecord::Base 
    has_many :domains 
    has_many :users 
end 

Y

class Domain < ActiveRecord::Base 
    belongs_to :account 
end 

Ahora me gustaría recuperar un usuario basándose en el nombre de usuario y un nombre de dominio (Vamos a suponer que estos son atributos de el usuario y las clases de dominio respectivamente). es decir, algo a lo largo de las líneas de

User.find(:first, :conditions =>{:username => "Paul", :domains => { :name => "pauls-domain"}}) 

Sé que la pieza anterior de código no funcionará ya que tengo que mencionar algo sobre el dominios mesa. Además, la asociación entre usuarios y dominios es de uno a muchos (lo que probablemente complica aún más las cosas).

¿Alguna idea sobre cómo debe formarse esta consulta?

+0

¿Seguro de sus asociaciones de modelos en lo correcto? Ellos no parecen ser. – Shreyas

Respuesta

11

Si está utilizando rieles 3.x, el siguiente código obtendría el resultado de la consulta:

User.where(:username => "Paul").includes(:domains).where("domains.name" => "paul-domain").limit(1) 

Para inspeccionar lo que suceda, puede anexar a .to_sql código de seguridad.

Si está utilizando Rails 2.x, será mejor que escriba la consulta SQL sin formato.

+0

Intenté su enfoque, pero no pude obtener la condición de combinación correcta. Terminé haciendo una combinación que incluía una consulta sin procesar y arel (sí, es Rails 3) – Dimitris

+0

Esto es exactamente lo que estaba buscando en Google. Para referencia manual, consulte: [ActiveRecord :: QueryMethods # includes] (http://apidock.com/rails/ActiveRecord/QueryMethods/includes) ** Nota: ** Asegúrese de pluralizar el nombre del método. Es muy probable que la forma singular llame a [Module # include] (http://ruby-doc.org/core-2.2.0/Module.html#method-i-include) –

5

El siguiente fragmento de código hizo el truco:

User.joins(:account).joins('INNER JOIN "domains" ON "accounts"."id" = \ 
"domains"."account_id"').where(:users => {"username" => "Paul"}). 
where(:domains => {"name" => "paul-domain"}) 

Lo sentimos cómo es el formato de esta larga línea de código

Cuestiones relacionadas