Rails, как получить доступ к атрибутам дочерней модели, где

Допустим, у меня есть две модели:

Кампания и квалификация. Кампания has_one :qualification и квалификация belongs_to :campaign.

Предположим, что квалификация имеет логический атрибут male_gender. Какой самый эффективный способ найти все кампании, имеющие квалификацию с male_gender == true

Один из способов — перебрать квалификацию с индексом male_gender. Создайте массив идентификаторов кампаний, а затем получите кампании с этими идентификаторами, но это кажется не очень эффективным.

В идеале я хотел бы сделать что-то вроде Campaign.where("qualification.male_gender: true")

Это возможно? Есть лучший способ сделать это?


person Tom Hammond    schedule 06.02.2016    source источник


Ответы (1)


Вы, конечно, можете это сделать. Используя объединение, вы можете ссылаться на другую таблицу в своем запросе where:

Campaign.joins(:qualification).where(qualifications: {male_gender: true})

Редактирование Rich Peck

Вы также можете поместить это в область:

#app/models/campaign.rb
class Campaign < ActiveRecord::Base
   scope :male_gender, -> { joins(:qualification).where(qualifications: {male_gender: true}) }
end

... что позволит вам позвонить @campaigns = Campaign.male_gender

person Jon    schedule 06.02.2016
comment
Гений! Спасибо большое! - person Tom Hammond; 06.02.2016
comment
Богатый - это было бы более эффективно? Или просто для удобства кодирования? - person Tom Hammond; 07.02.2016
comment
Функционально они идентичны. Однако использование области действия позволит вам легко использовать запрос во многих местах, не дублируя код повсюду. То же, что и с любым другим запросом. Все, что вы делаете во многих местах для одного и того же запроса данных, является хорошим кандидатом на перемещение в область действия. - person Jon; 07.02.2016