В моей текущей программе rails, когда я использую что-то вроде
user = User.find(10)
Когда нет пользователя с ID = 10, у меня будет исключение, например:
ActiveRecord::RecordNotFound: Couldn't find User with ID=10
Могу ли я получить nil вместо того, чтобы вызывать исключение, когда я делаю что-то вроде:
unless user = Challenge.find(10)
puts "some error msg"
end
Я просто хочу получить ноль, когда нет записей, и я не хочу использовать begin / rescue
Спасибо
Ответы:
Да просто сделай:
Для Rails 4 и 5:
источник
.find_by_*
что возвращается nil, а the.find
нет.Something.find_by(id: x)
он создает оператор SQL со всеми парами атрибут / значение хэша как часть предложения WHERE. Мне кажется, это ошибка Rails.find_by_...
поиска для каждого атрибута, который есть в модели:id
. Итак,Challenge.find_by_id(10)
должно работать независимо от версии Rails.Challenge.find(10) rescue nil
В Rails 4 динамические средства поиска, такие как
find_by_id
использованные в принятом ответе, устарели.В дальнейшем вам следует использовать новый синтаксис:
источник
Challenge.find_by(id: 10)
это другой способ написать этовы можете сделать это немного хакерским, просто используйте интерфейс запросов ActiveRecord.
это вернет nil вместо исключения исключения
источник
find_by_id
то, что он переносится с Rails 3 на 4. В rails 4 этоfind_by(:id => 10)
.Почему бы вам просто не поймать исключение? Ваш случай выглядит точно так же, как и для каких исключений:
Если вы хотите исправить ошибку в блоке восстановления (например, установив пользователя-заполнителя (нулевой шаблон)), вы можете продолжить работу со своим кодом под этим блоком. В противном случае вы можете просто поместить весь свой код для «счастливого случая» в блок между «begin» и «rescue».
источник
begin…end
блок, если у вас уже есть такой блок, как метод контроллера. В этом случае единственная дополнительная линия, которая вам понадобится, - этоrescue
линия. Гораздо элегантнее и проще в обращении, чем проверкаnil
с помощьюif
оператора.Вы можете попробовать это
Challenge.exists?(10)
источник
Для тех, кто борется с mongoid , оказывается, что оба метода
find
и вызовутfind_by
исключение - независимо от вашей версии rails!Существует опция (а именно, raise_not_found_error ), для которой может быть установлено значение false, но когда falsey делает
find
метод, также не вызывает исключение.Таким образом, решение для пользователей монгоидов - это отвратительный код:
источник
.where(email: params[:email]).first
мне.rescue
синтаксис, поскольку он может скрыть такие проблемы, как опечатки,так же просто, как:
источник
if user...else
Вы можете использовать find_by с обязательным атрибутом (в вашем случае id), это вернет nil вместо выдачи ошибки, если данный идентификатор не найден.
или вы можете использовать новый формат:
Вы также можете использовать where, но вы должны знать, что where return активное отношение записи с нулем или несколькими записями, которые вам нужно использовать сначала, чтобы вернуть только одну запись или nil в случае возврата нулевых записей.
источник