Rails ActiveRecord находит массив идентификаторов, но некоторые не найдены - PullRequest
2 голосов
/ 20 апреля 2020

Я пытаюсь найти модель по массиву идентификаторов, например, так:

Model.find [1,2,3]

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

#<Model id: 1>
#<Model id: 3>

Я получаю ошибку, подобную этой:

#<ActiveRecord::RecordNotFound: Couldn't find all Models with 'id': (1, 2, 3) (found 2 results, but was looking for 3).>

Можно ли перехватить эту ошибку и определить, какая из моделей отсутствовала?

сказать, что я в мой контроллер:

def index
  @models = Model.find params.require(:model_ids)
rescue ActiveRecord::RecordNotFound => e
  e.full_message
  ???
end

Я бы хотел, чтобы в строке ??? был запущен какой-то код исключения e, который вернет 2, сообщая мне, какой из моделей не было найдено, поэтому я могу перезапустить запрос без него, отметив, какие из них не были найдены.

1 Ответ

4 голосов
/ 20 апреля 2020

Неправильный метод. .find должен использоваться для поиска определенных c записей, когда вы хотите, чтобы код поднял ActiveRecord::RecordNotFound. Это сделано, чтобы гарантировать, что запись существует и избежать ошибок с нулевым значением. Обычно это используется для запуска ответа 404 без повторения одного и того же шаблона:

def show
  @record = Record.find_by(id: params[:id])
  unless @record
    render file: 'public/404.html', status: :not_found
  end
end

Используйте .find_by(id: id), если вы не хотите, чтобы код повышался.

Для извлечения нескольких записей используйте где:

models = Model.where(id: [1,2,3])

Если вы хотите определить, какие из этих идентификаторов не существуют, используйте массив diff:

bad_ids = [1,2,3] - models.ids
...