Определение пересечения двух отношений HABTM в рельсах 3 - PullRequest
1 голос
/ 11 марта 2011

У меня есть следующие отношения:

class Article < ActiveRecord::Base
has_and_belongs_to_many :required_certs, :class_name=>"Certification"
...
end

class User < AR::B
has_and_belongs_to_many :certifications
...
end

Я бы хотел найти всех пользователей, которые имеют те же сертификаты, что и статья. Таким образом, если у статьи есть сертификаты A и B, а у пользователя A, B, C, D, этот пользователь будет возвращен. Пользователей только с А или просто Б не будет. Так что по сути, что-то вроде

User.joins(:certifications).where('certifications.id IN (?)', @article.required_certs.collect{|c| c.id})

Вместо использования оператора IN, я думаю, мне придется использовать AND, потому что мне нужны только пользователи, у которых есть ВСЕ указанные сертификаты.

Я в тупике, поэтому любая помощь будет высоко ценится!

Спасибо

1 Ответ

1 голос
/ 11 марта 2011

Вот как я это сделал, но я открыт для более элегантных решений!

@certs = @article.required_certs.collect{|c| c.id}
User.all(:joins=>:certifications, 
         :group=>User.attributes_for_sql, 
         :select=>'users.*', 
         :conditions => ['certifications.id in (?)', @certs], 
         :having=> "count(*)=#{@certs.length}")

Надеюсь, это кому-нибудь поможет!

...