Find() с нулем, когда нет записей

В моей текущей программе рельсов, когда я использую что-то вроде

 user = User.find(10)

Когда нет пользователя с ID = 10, у меня будет такое исключение, как:

ActiveRecord::RecordNotFound: Couldn't find User with ID=10

Могу ли я получить нуль вместо того, чтобы поднимать исключение, поэтому, когда я делаю что-то вроде:

unless user = Challenge.find(10)
  puts "some error msg"         
end

Я просто хочу получить нуль, когда нет записей, и я не хочу использовать start/rescue

Спасибо

Ответ 1

Да, просто выполните:

Challenge.find_by_id(10)

Для Rails 4 и 5:

Challenge.find_by(id: 10)

Ответ 2

В Rails 4 динамические искатели, такие как find_by_id, которые использовались в принятом ответе, были устаревшими.

Двигаясь вперед, вы должны использовать новый синтаксис:

Challenge.find_by id: 10

Ответ 3

вы можете сделать это немного хакерским, просто используйте интерфейс запросов ActiveRecord.

это вернет нуль, вместо того, чтобы поднимать исключение

  User.where(:id => 10).first

Ответ 4

Почему бы вам просто не поймать исключение? Ваше дело выглядит точно так же, как были сделаны исключения:

begin
  user = User.find(10)
rescue ActiveRecord::RecordNotFound
  puts "some error msg"
end

Если вы хотите восстановиться после ошибки в блоке аварийного восстановления (например, установив пользователя-заполнителя (нулевой шаблон)), вы можете продолжить свой код ниже этого блока. В противном случае вы можете просто поместить весь свой код для "счастливого случая" в блок между "началом" и "спасением".

Ответ 5

Вы можете попробовать этот Challenge.exists?(10)

Ответ 6

Для тех, кто борется с mongoid, выясняется, что методы find и find_by будут создавать исключение - независимо от вашей версии rails!

Существует опция (а именно raise_not_found_error), которая может быть установлена ​​в значение false, но когда falsey делает метод find также повышайте исключение.

Таким образом, решение для пользователей монгоидов - это отвратительный код:

User.where(id: 'your_id').first # argghhh

Ответ 7

Вы можете использовать find_by с требуемым атрибутом (в вашем случае id), это вернет nil вместо того, чтобы давать ошибку, если данный идентификатор не найден.

user = Challenge.find_by_id(id_value)

или вы можете использовать новый формат:

user = Challenge.find_by id: id_value

Вы также можете использовать, но вы должны знать, что, когда возвращают отношение активной записи с нулевыми или более записями, вам нужно использовать сначала, чтобы вернуть только одну запись или ноль в случае возврата нулевых записей.

user = Challenge.where(id: id_value).first

Ответ 8

так же просто, как:

user = User.find(10) rescue nil