2016-02-06 3 views
0

Предположим, у меня есть две модели:Рельсы, как получить доступ к атрибутам детской модели, где

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

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

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

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

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

ответ

2

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

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

Rich Пек редактировать

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

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

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

+0

Гений! Большое спасибо! –

+0

Богатый - будет ли это более эффективным? Или просто для удобства кодирования? –

+0

Функционально они идентичны. Однако использование области позволит вам легко использовать запрос во многих местах без дублирования кода везде. То же, что и с любым другим запросом. Все, что вы делаете во многих местах для одного и того же запроса данных, является хорошим кандидатом для перехода в область. – Jon

Смежные вопросы