it-swarm.com.ru

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

В моей текущей программе 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

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

Спасибо

84
Eqbal

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

Challenge.find_by_id(10)

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

Challenge.find_by(id: 10)
144
apneadiving

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

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

Challenge.find_by id: 10
29
hattila91

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

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

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

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

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

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

5
morgler

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

4
tonymarschall

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

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

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

User.where(id: 'your_id').first # argghhh
3
Cristiano Mendonça

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

user = User.find(10) rescue nil
1
mohamed-ibrahim

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

user = Challenge.find_by_id(id_value)

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

user = Challenge.find_by id: id_value

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

user = Challenge.where(id: id_value).first
0
Alanoud Just