find () с нулем, когда нет записей - PullRequest
84 голосов
/ 07 марта 2012

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

 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

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

Спасибо

Ответы [ 8 ]

149 голосов
/ 07 марта 2012

Да, просто сделайте:

Challenge.find_by_id(10)

Для рельсов 4 и 5:

Challenge.find_by(id: 10)
30 голосов
/ 12 ноября 2014

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

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

Challenge.find_by id: 10
14 голосов
/ 07 марта 2012

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

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

  User.where(:id => 10).first
5 голосов
/ 31 января 2016

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

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

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

4 голосов
/ 07 марта 2012

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

3 голосов
/ 01 ноября 2017

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

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

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

User.where(id: 'your_id').first # argghhh
2 голосов
/ 19 декабря 2016

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

user = User.find(10) rescue nil
0 голосов
/ 04 октября 2016

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

user = Challenge.find_by_id(id_value)

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

user = Challenge.find_by id: id_value

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

user = Challenge.where(id: id_value).first
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...