Примените условие NOT IN к модели, имеющей отношение has_many с другой, Rails

0

У меня есть прецедент, чтобы применить NOT IN как условие в where where для модели с has_many ассоциацией.

У меня есть модель пользователя, у которой есть отношения has_many с событиями.

Для получения всех пользователей, у которых есть конкретное событие, помогает код ниже.

User.find(:all, joins: :events, conditions: [events.event_name = 'Event One'] )

Я ищу оптимальный способ получить обратное от этого, как и для всех пользователей, у которых нет определенного события.

Что-то вроде User.find(:all, joins: :events, conditions: [clause to fetch all users who do not have event_name 'Event One' ] )

  • 0
    как насчет перехода на User.find(:all, joins: :events, conditions: [events.event_name != 'Event One'] )
  • 0
    Это не сработает, так как объединение по умолчанию является внутренним объединением, и проверка «Не равно» будет истинной для всех остальных событий имя_символа, и пользователь выдаст нежелательные результаты, скажем, если у пользователя_1 есть десять других событий и «Событие 1», это вернет user_1 десять раз, хотя user_1 имеет 'Event One'.
Теги:
activerecord

3 ответа

1
Лучший ответ

Вы можете сделать этот запрос ниже

User.where("id NOT IN (?)", User.joins(:events).where("events.name = ?", "Event One").map(&:id))

Надеюсь, это поможет вам.

0

Измените запрос следующим образом:

User.find(:all, joins: :events, conditions: [events.event_name != 'Event One'] )

если это не работает, вы можете попробовать что-то вроде ниже.

User.joins(:events).where('events.event_name != ?', 'Event One').distinct

Также вы можете проверить другие альтернативы, чтобы получить записи uniq здесь

  • 0
    Это не сработает, так как объединение по умолчанию является внутренним объединением, и проверка «Не равно» будет истинной для всех остальных событий имя_символа, и пользователь выдаст нежелательные результаты, скажем, если у пользователя_1 есть десять других событий и «Событие 1», это вернет user_1 десять раз, хотя user_1 имеет 'Event One'
  • 0
    Вы можете использовать разные на ActiveRecord :: Relation, чтобы получить уникальную запись, пожалуйста, проверьте обновленный ответ
Показать ещё 1 комментарий
0

Запрос может быть следующим:

User.joins(:events).where.not(events: { name: ["Event One"] }).all

Ещё вопросы

Сообщество Overcoder
Наверх
Меню