Подтвердить что ты не робот

Область Rails, которая ничего не делает для значений NOT IN

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

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

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

Если у меня нет бита "ids.empty?? Отношение:", когда id пуст, сгенерированный SQL

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

scope :excluding_ids, ->(ids) { where.not(id: ids) }

Ответ 3

Здесь небольшое отклонение от ответа Дугласа, используя синтаксис лямбда ruby ​​1.9 stabby и без скобок в методе where.

scope :excluding_ids, ->(ids) {where("id NOT IN (?)", ids) if ids.any?}

Ответ 4

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

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