2011-01-04 9 views
5

Próbuję pobrać obiekt activerecord z mojego db. Moje modele sąactiverecord znaleźć przez asocjację

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

I

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

I

class Domain < ActiveRecord::Base 
    belongs_to :account 
end 

Teraz chciałbym odzyskać użytkownika w oparciu o nazwę użytkownika i nazwę domeny (pozwala zakładać, że są to atrybuty odpowiednio klasa Użytkownik i Domena). to znaczy coś wzdłuż linii

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

Wiem, że powyższy fragment kodu nie będzie działać, ponieważ muszę wspomnieć coś o domen tabeli. Powiązanie między użytkownikami i domenami to jeden-do-wielu (co prawdopodobnie dodatkowo komplikuje sytuację).

Wszelkie pomysły na temat tego, jak należy utworzyć to zapytanie?

+0

Czy na pewno twoi stowarzyszenia modelu są prawidłowe? Nie wydają się być. – Shreyas

Odpowiedz

11

Jeśli używasz Rails 3.x, następujący kod by otrzymać wynik zapytania:

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

Aby sprawdzić, co się stało, można dołączyć .to_sql do powyższego kodu.

Jeśli używasz Railsów 2.x, lepiej napisz surowe zapytanie SQL.

+0

Próbowałem Twojego podejścia, ale nie mogłem uzyskać prawidłowego warunku łączenia. Skończyło się na tym, że robiłem kombinację, która zawierała surowe zapytanie i arel (tak, to Rails 3). – Dimitris

+0

To jest dokładnie to, czego szukałem w Google. Aby zapoznać się z podręcznikiem podręcznika, zobacz: [ActiveRecord :: QueryMethods # includes] (http://apidock.com/rails/ActiveRecord/QueryMethods/includes) ** Uwaga: ** Upewnij się, że nazwa metody została zmieniona na plur. Pojedyncza forma najprawdopodobniej wywoła [Module # include] (http://ruby-doc.org/core-2.2.0/Module.html#method-i-include) –

5

Poniższy kawałek kodu wystarczyły:

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

przepraszam formatowania tej długiej linii kodu

Powiązane problemy