2011-01-03 2 views
19

Я хотел бы выполнить запрос ActiveRecord, который возвращает все записи, кроме тех записей, которые имеют определенные идентификаторы. Иды, которые я хотел бы исключить, хранятся в массиве. Итак:Как исключить массив идентификаторов из запроса в Rails (используя ActiveRecord)?

ids_to_exclude = [1,2,3] 
array_without_excluded_ids = Item. ??? 

Я не уверен, как завершить вторую линию.

фона: То, что я уже пробовал:

Я не уверен, что фон нужен, но я уже пробовал различные комбинации .find и .гд. Например:

array_without_excluded_ids = Item.find(:all, :conditions => { "id not IN (?)", ids_to_exclude }) 
array_without_excluded_ids = Item.where("items.id not IN ?", ids_to_exclude) 

Эти сбои. This tip может быть на правильном пути, но мне не удалось его адаптировать. Любая помощь будет принята с благодарностью.

+5

Вы пробовали ': условия => [ "(?) Идентификатор не IN", ids_to_exclude]'? Обратите внимание на скобки, а не на фигурные скобки. –

+2

В Rails 3.2.1 я использовал этот 'MyModel.order ('created_at DESC'). Где ('id NOT in (?)', Ids_to_exclude) .limit (5)' в запросе недавно – Clay

ответ

31

Это должно работать:

ids_to_exclude = [1,2,3] 
items_table = Arel::Table.new(:items) 

array_without_excluded_ids = Item.where(items_table[:id].not_in ids_to_exclude) 

И это полностью объектно-ориентированный без всяких :-)

+0

Это работает как шарм; Спасибо. Я немного посмотрел на Ареля; у вас есть время, чтобы точно объяснить, что делают последние две строки? – CuriousYogurt

+3

Arel :: Table - это абстракция таблицы вашей базы данных с коллекцией столбцов. В моей системе я использую PostgreSQL, поэтому столбец имеет тип ActiveRecord :: ConnectionAdapters :: PostgreSQLColumn и представляет характеристики столбца моей БД. Каждый столбец содержит имя столбца, тип БД этого столбца, значения по умолчанию, масштаб, характеристики точности и т. Д. Нам понадобился экземпляр таблицы для сопоставления предикатов с столбцом идентификатора. Метод «not_in» имеет тип Arel :: Predications, и это напрямую переводится в SQL, который вы хотели, например. «НЕ В (1, 2, 3)». – Scott

+0

Благодарим вас за подробности. – CuriousYogurt

2

Вы также можете использовать Squeel камень для выполнения такого запроса. Документация об этом, идет here

30

Rails 4 решение:

ids_to_exclude = [1,2,3] 
array_without_excluded_ids = Item.where.not(id: ids_to_exclude) 

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

  • Нет связанных вопросов^_^