Відповіді:
У Rails 4.x (див. Http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions )
GroupUser.where.not(user_id: me)
У рейках 3.x
GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))
Щоб скоротити довжину, ви можете зберігати GroupUser.arel_table
змінну або, якщо ви використовуєте всередині самої моделі GroupUser
, наприклад, у scope
, ви можете використовувати arel_table[:user_id]
замістьGroupUser.arel_table[:user_id]
Синтаксичний рейтинг 4.0 на відповідь @ jbearden
GroupUser.where(other_condition: true).where.not(user_id: user_id)
Єдиний спосіб, коли ви можете зробити це більш привабливим, - це MetaWhere .
У MetaWhere є новіший двоюрідний брат, який називається Squeel, який дозволяє такий код:
GroupUser.where{user_id != me}
Само собою зрозуміло, що якщо це єдиний рефактор, який ви збираєтеся зробити, використовувати дорогоцінний камінь не варто, і я б просто дотримувався того, що у вас є. Squeel корисний у ситуаціях, коли у вас багато складних запитів, що взаємодіють з кодом Ruby.
Рейки 4:
Якщо ви хочете використовувати як не рівне, так і рівне, ви можете використовувати:
user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
Якщо ви хочете використовувати різні оператори (тобто. >
, <
), В якийсь момент ви можете переключити позначення на таке:
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
?
Ви повинні завжди включати ім'я таблиці в SQL-запит, коли справу з асоціаціями.
Дійсно, якщо інша таблиця містить user_id
стовпчик, і ви приєднаєте обидві таблиці, у вас буде неоднозначне ім'я стовпця в SQL-запиті (тобто проблеми).
Отже, у вашому прикладі:
GroupUser.where("groups_users.user_id != ?", me)
Або трохи докладніше:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
Зауважте, що якщо ви використовуєте хеш, вам про це не потрібно хвилюватися, оскільки Rails піклується про нього за вас:
GroupUser.where(user: me)
У Rails 4, як сказав @ dr4k3, not
додано метод запиту :
GroupUser.where.not(user: me)