web-dev-qa-db-fra.com

find () avec nil quand il n'y a pas d'enregistrements

Dans mon programme Rails actuel, lorsque j'utilise quelque chose comme 

 user = User.find(10)

Quand il n'y a pas d'utilisateur avec ID = 10, j'aurai une exception comme: 

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

Puis-je obtenir nil au lieu de générer une exception alors, lorsque je fais quelque chose comme: 

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

Je veux juste avoir zéro quand il n'y a pas d'enregistrements et je ne veux pas utiliser begin/rescue 

Merci 

81
Eqbal

Oui, fais juste:

Challenge.find_by_id(10)

Pour les rails 4 et 5:

Challenge.find_by(id: 10)
144
apneadiving

Dans Rails 4, les outils de recherche dynamiques (tels que find_by_id qui était utilisé dans la réponse acceptée) étaient obsolètes.

À l'avenir, vous devriez utiliser la nouvelle syntaxe:

Challenge.find_by id: 10
29
hattila91

vous pouvez le faire un peu de hack, utilisez simplement l'interface de requête ActiveRecord.

cela retournera nil, au lieu de lever une exception

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

Pourquoi ne pas simplement attraper l'exception? Votre cas ressemble exactement à ce que des exceptions ont été faites pour:

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

Si vous souhaitez récupérer l'erreur dans le bloc de secours (par exemple, en définissant un utilisateur fictif (modèle null)), vous pouvez continuer avec votre code sous ce bloc. Sinon, vous pourriez simplement mettre tout votre code pour le "cas heureux" dans le bloc entre "commencer" et "porter secours".

5
morgler

Vous pouvez essayer ceci Challenge.exists?(10)

4
tonymarschall

Pour ceux qui luttent avec mongoid, il s'avère que les méthodes find et find_by lèveront une exception - quelle que soit votre version de Rails!

Il existe une option (nommément raise_not_found_error) qui peut être définie sur false, mais lorsque la méthode find est créée par falsey, elle ne génère pas non plus d'exception.

Ainsi, la solution pour les utilisateurs de mongoïdes est le code dégoûtant:

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

aussi simple que:

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

Vous pouvez utiliser find_by avec l'attribut requis (dans votre cas, l'id). Cela retournera nil au lieu de donner une erreur si l'id donné n'est pas trouvé.

user = Challenge.find_by_id(id_value)

ou vous pouvez utiliser le nouveau format:

user = Challenge.find_by id: id_value

Vous pouvez également utiliser où, mais vous devez savoir que, où renvoyer une relation d’enregistrement actif avec zéro enregistrement ou plus, vous devez d’abord utiliser pour renvoyer un seul enregistrement ou nil si aucun enregistrement n’est renvoyé.

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