Проверить, не существует ли запись в Rails (из массива идентификаторов)? - PullRequest
17 голосов
/ 01 декабря 2010

Я могу сделать это, чтобы проверить, существует ли запись (записи) (скажем, идентификатор "1" существует, а "2" и "3" нет):

Model.exists?(:id => [1, 2, 3]) #=> true

Как мне поступить наоборот, так:

Model.not_exists?(:id => [1, 2, 3]) #=> true

Ответы [ 6 ]

27 голосов
/ 01 декабря 2010

просто добавь! оператор

!Model.exists?(:id => [1, 2, 3]) #=> true
5 голосов
/ 01 декабря 2010

Если вам нужны только записи поиска по идентификатору, вы можете попробовать это

class Model
  def self.not_exists?(ids)
    self.find(ids)
    false
  rescue
    true
  end
end

Если какой-либо из идентификаторов не существует, метод find вызовет исключение ActiveRecord :: RecordNotFound, которое мы просто перехватываем и возвращаем true.

Извините за мой английский:)

1 голос
/ 01 марта 2018

Более рубиновый способ сделать это - использовать unless с exists?. Таким образом, вам не нужно использовать !. Я полагаю, ваш вариант использования выглядит примерно так:

def my_method
    return unless Model.exists?(:id => [1, 2, 3])

    # do something
end

Вы можете заменить 1, 2, 3 на переменную (назовите ее id или что-то еще) и даже полностью удалить массив, если хотите: .exists?(id: id)

1 голос
/ 29 мая 2015

Используйте empty?, это то, что вы хотите.Он использует count(*) против select 1 as one.

> Rocketeer.where(:id => [1, 2, 3]).empty?
   (0.6ms)  SELECT COUNT(*) FROM "rocketeers" WHERE "rocketeers"."id" IN (1, 2, 3)
=> false

> Rocketeer.where(:id => [1, 2, 3]).any?
   (0.5ms)  SELECT COUNT(*) FROM "rocketeers" WHERE "rocketeers"."id" IN (1, 2, 3)
=> true

> Rocketeer.where(:id => [1, 2, 3]).exists?
  Rocketeer Exists (0.5ms)  SELECT  1 AS one FROM "rocketeers" WHERE "rocketeers"."id" IN (1, 2, 3) LIMIT 1
=> true
1 голос
/ 22 апреля 2015
class Model
  def self.does_not_exist?(ids)
    Model.where(id: ids).count < ids.size
  end
end

Объяснение: Если (и только если) все искомые экземпляры существуют, Model.where(id: ids).count равно ids.size.

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

0 голосов
/ 06 мая 2015

Другой простой способ - использовать метод where с массивом идентификаторов.

# If the count of the query is equal to the count of all of the id's then the statement will return false.
# Else it will return true if not all ids exists in the database.
Model.where(id: [1, 2, 3]).count < [1,2,3].count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...