2016-07-14 3 views
0

Я чувствую себя глупо, но я не могу найти ответ на этот вопрос.Обратный IN in Rails

Если у меня есть пользователь с большим количеством атрибутов, учитывая список атрибутов, я могу попросить рельсов что-то вроде этого:

User.where("attributes.id IN ?", list_of_attribute_ids) 

С помощью соответствующих соединяющую или включает или любой другой.

Однако я не знаю, как найти обратный набор этих пользователей. То есть, учитывая 100 пользователей, если результат вернет 75 записей, я не знаю, как найти другие 25!

Я думал

User.where("attributes.id NOT IN ?", list_of_attribute_ids) 

может работать (так же, User.where.not), но это не так! Вместо этого они ищут тех пользователей, где ни один из их атрибутов не является одним из списка, что полезно, но не то, что я хочу.

Единственный способ я знаю, как это сделать, это что-то вроде:

User.where.not(id: User.where("attributes.id IN ?", list_of_attribute_ids).pluck(:id)) 

Который является своего рода как SQL для выбора пользователя, где идентификатор не в (собрать список идентификаторов).

Но это массово не работает, и, как правило, просто не может справиться с базой данных с более чем несколькими (сто) вводами.

Как вы это делаете?

+0

Таким образом, правильный "обратный" вашего первого заявления все пользователи минус те, кто соответствует первое утверждение. В зависимости от ваших конкретных потребностей возможно несколько подходов. Если вам нужны оба набора одновременно, вы можете просто прочитать весь набор данных, а затем выбрать только идентификаторы совпадающих пользователей (с атрибутами) и разделить/сгруппировать их в приложении. Или вы можете сделать этот последний запрос. –

+0

http://guides.rubyonrails.org/active_record_querying.html#left-outer-joins это может помочь вам – Vishal

ответ

0

Я думаю, вы могли бы использовать левые внешние соединения, как @Vishal, упомянутые в комментариях.

Смотрите руководства: http://guides.rubyonrails.org/active_record_querying.html#left-outer-joins

рельсы 4:

joins("LEFT OUTER JOIN <something>") 

рельсы 5:

left_outer_joins(:something) 
+0

Да, вы правы, теперь я узнал, что это левое внешнее соединение. В rails 5 есть метод left_outer_join, но в <= 4 я получил работу с чем-то вроде User.joins («LEFT OUTER JOINS атрибуты ON attributes.id в?», List_of_attribute_ids) .where («attributes IS NULL») , Ключ, заключающийся в том, что левое внешнее соединение по-прежнему хранит те записи, где нет связи. will_paginate породил некоторые проблемы, поэтому у меня пока нет решения моей полной проблемы, но это ответ на эту проблему. Спасибо. – Tony

+0

Я отредактировал anwser @Tony – siegy22

+0

Избегайте комментариев, таких как thanks. Ха - спасибо @RaVeN. Извините SO – Tony