Область Rails, которая ничего не делает для значений NOT IN - PullRequest
12 голосов
/ 02 апреля 2011

У меня есть область Rails 3, которая исключает массив идентификаторов.

Каков наилучший способ записать область видимости, чтобы она ничего не делала, когда массив пуст и все еще цепочки? В настоящее время у меня есть это, которое работает, но кажется немного обманчивым:

scope :excluding_ids, 
         lambda {|ids| ids.empty? ? relation : where('id not in (?)', ids) }

Если у меня нет бита "отношение ids.empty??:", Когда идентификатор пуст, генерируется SQL

... ID not in (NULL) ...

, который всегда ничего не вернет. Так что-то вроде:

Model.excluding_ids([]).where('id > 0')

не возвращает результатов.

Ответы [ 4 ]

19 голосов
/ 02 апреля 2011

Если массив ids пуст, то ничего не возвращается.

scope :excluding_ids, lambda { |ids|
  where(['id NOT IN (?)', ids]) if ids.any?
}

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

8 голосов
/ 07 июня 2013

В Rails 4 вы можете использовать:

scope :excluding_ids, ->(ids) { where.not(id: ids) }
3 голосов
/ 30 января 2013

Вот небольшой вариант ответа Дугласа, использующий синтаксис rub 1.9 stabby lambda без скобок в методе where.

scope :excluding_ids, ->(ids) {where("id NOT IN (?)", ids) if ids.any?}
0 голосов
/ 02 апреля 2011

Как насчет следующего?(Тем не менее, он по-прежнему проверяет наличие пустого массива, так что если это то, что вы пытаетесь избежать, это не так уж и много улучшений)

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