2011-01-04 21 views
5

Sto cercando di recuperare un oggetto activerecord dal mio db. I miei modelli sonoactiverecord find through association

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

E

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

E

class Domain < ActiveRecord::Base 
    belongs_to :account 
end 

Ora vorrei richiamare un utente in base al nome utente e un nome di dominio (lascia supporre che questi sono gli attributi di rispettivamente le classi User e Domain). vale a dire qualcosa sulla falsariga di

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

So che il pezzo di codice di cui sopra non funziona da quando devo citare qualcosa circa il domini tavolo. Inoltre, l'associazione tra utenti e domini è uno-a-molti (il che probabilmente complica ulteriormente le cose).

Qualche idea su come dovrebbe essere formata questa domanda?

+0

Sei sicuro le vostre associazioni modello ha ragione? Loro non sembrano essere. – Shreyas

risposta

11

Se stai usando Rails 3.x, il seguente codice otterrebbe il risultato della query:

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

per ispezionare ciò accada, è possibile aggiungere .to_sql al codice di cui sopra.

Se si utilizza Rails 2.x, è preferibile scrivere la query sql raw.

+0

Ho provato il tuo approccio ma non sono riuscito a ottenere la condizione di join corretta. Ho finito per fare una combinazione che includeva una query grezza e Arel (sì, è Rails 3) – Dimitris

+0

Questo è esattamente ciò che stavo cercando Google. Per riferimento manuale, vedere: [ActiveRecord :: QueryMethods # includes] (http://apidock.com/rails/ActiveRecord/QueryMethods/includes) ** Nota: ** Assicurarsi di pluralizzare il nome del metodo. Molto probabilmente la forma singolare chiamerà [Modulo # include] (http://ruby-doc.org/core-2.2.0/Module.html#method-i-include) –

5

Il seguente pezzo di codice ha fatto il trucco:

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

Mi dispiace per la formattazione di questa lunga riga di codice

Problemi correlati