Я чувствую себя глупо, но я не могу найти ответ на этот вопрос.Обратный 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 для выбора пользователя, где идентификатор не в (собрать список идентификаторов).
Но это массово не работает, и, как правило, просто не может справиться с базой данных с более чем несколькими (сто) вводами.
Как вы это делаете?
Таким образом, правильный "обратный" вашего первого заявления все пользователи минус те, кто соответствует первое утверждение. В зависимости от ваших конкретных потребностей возможно несколько подходов. Если вам нужны оба набора одновременно, вы можете просто прочитать весь набор данных, а затем выбрать только идентификаторы совпадающих пользователей (с атрибутами) и разделить/сгруппировать их в приложении. Или вы можете сделать этот последний запрос. –
http://guides.rubyonrails.org/active_record_querying.html#left-outer-joins это может помочь вам – Vishal