Как проверить существование ActiveRecord из запроса без итерации? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть модель Item с атрибутами attr1, attr2 и attr3.

Учитывая коллекцию из Item моделей (например, из Item.all), как я могу проверить, существует ли элемент с attr1 == value1, attr2 == value2 и attr3 == value3 без приходится перебирать все элементы или выполнять другой запрос?

Ответы [ 3 ]

4 голосов
/ 22 мая 2019

С точки зрения алгоритмов, вы не можете искать несортированный список быстрее, чем O (n).Поэтому итерация по вашей коллекции - лучший способ поиска в вашей коллекции.

2 голосов
/ 22 мая 2019

Если у вас уже есть все элементы, присвоенные переменной items, вы можете просто использовать find (или detect) для поиска подходящей записи в этом списке без выполнения другого запроса:

items.find { |item| item.attr1 == value1 && item.attr2 == value2 && item.attr3 == value3 w }

Примечание: find возвращает первую подходящую запись, когда найдена, nil в противном случае.

1 голос
/ 22 мая 2019

Вы можете использовать ActiveRecord :: Relation # any?

Item.where(attr1: value1, attr2: value2, attr3: value3).any?

Если у вас уже есть объект отношения ActiveRecord, вы все равно можете использовать этот подход. Например, если у вас есть это в вашем контроллере:

def index
  @items = Item.all
end

Вы можете сделать это по своему усмотрению или где-либо:

@items.where(attr1: value1, attr2: value2, attr3: value3).any?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...