2016-08-12 2 views
0

У меня есть два вложенных объекта: RecruitmentUser, который has_many RecruitmentUserStatusLog. RecruitmentUserStatusLog имеет статус, называемый статус. Я хочу выбрать RecruitmentUsers, у которых есть RecruitmentUserStatusLog со статусом = 'обработанный' и RecruitmentUserStatusLog со статусом = 'ответил'. Это не может быть только один из них .. Я пробовал некоторые запросы, используя ActiveRecord, но я не знаю, если это является наиболее эффективным способом .. Я попытался это:Лучший запрос для выбора вложенных объектов

RecruitmentUserStatusLog.where(status: ['processed', 'answered']).pluck(:recruitment_user_id).group_by {|id| id}.values.select{|duplicate_id| duplicate_id.size > 1} 

Выбрать, часть только для получения повторяющиеся события id (recruitment_user_id, у которых есть статус «обработан» и recruitment_user_id, который имеет статус «ответил»).

Но я думаю, что это «большая работа, и, возможно, есть более элегантный способ сделать этот запрос. Я искал, но не нашел его. Кто-нибудь может мне помочь?

+0

Начиная с StatusLogs это то, что я хотел бы сделать также, вы пытались использовать '.joins (: r_users)' вместо того, где вы идете в '.pluck'? –

+0

Да, чтобы использовать соединение, мне нужно сделать инверсию .. RecruitmentUser.joins (: log) .. но я не смог построить запрос, чтобы привести результаты, которые я хочу. –

+0

Не то, что я имею в виду. Что произойдет, если вы выполните «RecruitmentUserStatusLog.where» (статус: ['обработан', 'ответил']). Joins (: recruitment_users) 'и т. Д.? –

ответ

1

попробовать это

user_ids = RecruitmentUserStatusLog.where(status: ['processed', 'answered']) 
            .group(:recruitment_user_id) 
            .having("count(recruitment_user_id) > 1") 
            .count 
            .keys 

users = RecruitmentUser.find(user_ids) 
+0

Это именно то, что я хотел, спасибо! –

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