Ответ 1
Да, просто выполните:
Challenge.find_by_id(10)
Для Rails 4 и 5:
Challenge.find_by(id: 10)
В моей текущей программе рельсов, когда я использую что-то вроде
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
Спасибо
Да, просто выполните:
Challenge.find_by_id(10)
Для Rails 4 и 5:
Challenge.find_by(id: 10)
В Rails 4 динамические искатели, такие как find_by_id
, которые использовались в принятом ответе, были устаревшими.
Двигаясь вперед, вы должны использовать новый синтаксис:
Challenge.find_by id: 10
вы можете сделать это немного хакерским, просто используйте интерфейс запросов ActiveRecord.
это вернет нуль, вместо того, чтобы поднимать исключение
User.where(:id => 10).first
Почему бы вам просто не поймать исключение? Ваше дело выглядит точно так же, как были сделаны исключения:
begin
user = User.find(10)
rescue ActiveRecord::RecordNotFound
puts "some error msg"
end
Если вы хотите восстановиться после ошибки в блоке аварийного восстановления (например, установив пользователя-заполнителя (нулевой шаблон)), вы можете продолжить свой код ниже этого блока. В противном случае вы можете просто поместить весь свой код для "счастливого случая" в блок между "началом" и "спасением".
Вы можете попробовать этот Challenge.exists?(10)
Для тех, кто борется с mongoid, выясняется, что методы find
и find_by
будут создавать исключение - независимо от вашей версии rails!
Существует опция (а именно raise_not_found_error), которая может быть установлена в значение false, но когда falsey делает метод find
также повышайте исключение.
Таким образом, решение для пользователей монгоидов - это отвратительный код:
User.where(id: 'your_id').first # argghhh
Вы можете использовать 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
так же просто, как:
user = User.find(10) rescue nil