activerecord найти через ассоциацию - PullRequest
5 голосов
/ 04 января 2011

Я пытаюсь получить объект activerecord из моей базы данных.Мои модели

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

И

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

И

class Domain < ActiveRecord::Base
   belongs_to :account
end

Теперь я хотел бы получить пользователя на основе имени пользователя и имени домена (позволяетПредположим, что это атрибуты классов User и Domain соответственно).то есть что-то вроде

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

Я знаю, что приведенный выше фрагмент кода не будет работать, так как я должен упомянуть кое-что о таблице domains .Кроме того, связь между пользователями и доменами является взаимно однозначной (что, вероятно, еще более усложняет ситуацию).

Есть идеи о том, как должен формироваться этот запрос?

Ответы [ 2 ]

12 голосов
/ 04 января 2011

Если вы используете Rails 3.x, следующий код получит результат запроса:

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

Чтобы проверить, что происходит, вы можете добавить .to_sql к приведенному выше коду.

Если вы используете Rails 2.x, вам лучше написать необработанный SQL-запрос.

5 голосов
/ 05 января 2011

Следующий кусок кода сделал свое дело:

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

Извините за форматирование этой длинной строки кода

...