Как отфильтровать по более чем 1 ассоциации habtm - PullRequest
0 голосов
/ 08 ноября 2010

Я довольно новичок в Rails, поэтому не убивайте меня, если это глупый вопрос = P

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

class Profile < ActiveRecord::Base
has_and_belongs_to_many :sectors
has_and_belongs_to_many :languages

class Sector < ActiveRecord::Base
  has_and_belongs_to_many :profiles
end

class Language < ActiveRecord::Base
  has_and_belongs_to_many :profiles
end

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

Я гуглил, но все, что я мог найти, это как сделать это для1 хабтм, но мне это нужно для 2.

Все, что у меня есть, это:

def some_method(sector_id, language_id)
   Sector.find(sector_id).profiles
end

Но я не знаю, как добавить фильтр по language_id, не связываясь с объединениямиусловия или написание SQL, и, конечно, все в одном запросе ... Есть ли чистый / элегантный способ сделать это?

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Попробуйте это:

Profile.all(:joins => [:sectors, :languages], 
  :conditions => ["sectors.id = ? AND languages.id ?", sector_id, language_id])
1 голос
/ 09 ноября 2010

В приведенном выше примере вы уже сгенерировали 2 запроса sql,

  1. первый Sector.find (#id) (выберите на таблица секторов, чтобы получить запись с id == #id)

  2. второй .profiles (выберите в профилях таблица, чтобы получить все профили с следующий сектор - в этом выберите у вас уже есть внутреннее соединение profile_selectors on profile_selectors.profile_id = profiles.id автоматически генерируется рельсами)

Я надеюсь, что это то, что вы ищете: (но я использую: присоединяется ключ)

class Profile < ActiveRecord::Base
  has_and_belongs_to_many :sectors
  has_and_belongs_to_many :languages

  def self.some_method(language_id, sector_id)
    all(:conditions => ["languages.id = ? and sectors.id = ?", language_id, sector_id], :joins => [:languages, :sectors])
  end
end

Результатом этого метода является запрос 1 sql, и вы получаете профили, отфильтрованные по языку и секторам.

С наилучшими пожеланиями

Матеуш Юрашек

...