Проверьте, не существует ли записи в Rails (из массива идентификаторов)?
Я могу сделать это, чтобы проверить, существует ли запись (например, id "1", но "2" и "3" не):
Model.exists?(:id => [1, 2, 3]) #=> true
Как я делаю противоположное, так:
Model.not_exists?(:id => [1, 2, 3]) #=> true
Ответы
Ответ 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