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

Проверьте, не существует ли записи в Rails (из массива идентификаторов)?

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

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

Как я делаю противоположное, так:

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

class Model
  def self.does_not_exist?(ids)
    Model.where(id: ids).count < ids.size
  end
end

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

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

Ответ 4

Используйте empty?, это то, что вы хотите. Он использует count(*) vs 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

Ответ 5

Еще один простой способ - использовать метод where с массивом id.

# If the count of the query is equal to the count of all of the id 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