124 votes

Comment sélectionner un ID dans Array Rails ActiveRecord sans exception ?

Lorsque j'ai un tableau d'identifiants, comme

ids = [2,3,5]

et j'exécute

Comment.find(ids)

tout fonctionne bien. Mais lorsqu'il y a un id qui n'existe pas, j'obtiens une exception. Cela se produit généralement lorsque j'obtiens une liste d'identifiants qui correspondent à un certain filtre et que je fais quelque chose du genre

current_user.comments.find(ids)

Cette fois-ci, j'ai peut-être un ID de commentaire valide, mais qui n'appartient pas à l'utilisateur en question ; il n'est donc pas trouvé et je reçois une exception.

J'ai essayé find(:all, ids) mais il renvoie tous les enregistrements.

La seule façon de le faire maintenant est

current_user.comments.select { |c| ids.include?(c.id) }

Mais cela me semble être une solution super inefficace.

Y a-t-il un meilleur moyen de sélectionner ID dans le tableau sans obtenir d'exception sur un dossier inexistant ?

200voto

prismofeverything Points 2158

Si c'est simplement l'évitement de l'exception qui vous inquiète, la famille de fonctions "find_all_by " fonctionne sans lever d'exceptions.

Comment.find_all_by_id([2, 3, 5])

fonctionnera même si certains des ids n'existent pas. Cela fonctionne dans le

user.comments.find_all_by_id(potentially_nonexistent_ids)

également le cas.

144voto

mjnissim Points 1734

Mise à jour : Cette réponse est plus pertinente pour Rails 4.x

Faites-le :

current_user.comments.where(:id=>[123,"456","Michael Jackson"])

Le point fort de cette approche est qu'elle renvoie un fichier Relation auquel vous pouvez joindre d'autres .where clauses, .limit etc., ce qui est très utile. Il autorise également les identifiants inexistants sans lancer d'exceptions.

La syntaxe Ruby plus récente serait :

current_user.comments.where(id: [123, "456", "Michael Jackson"])

10voto

Sumit Munot Points 1253

Maintenant les méthodes .find et .find_by_id sont dépréciées dans rails 4. Nous pouvons donc utiliser les méthodes suivantes :

Comment.where(id: [2, 3, 5])

Cela fonctionnera même si certains des identifiants n'existent pas. Cela fonctionne dans le

user.comments.where(id: avoided_ids_array)

Également pour exclure les ID

Comment.where.not(id: [2, 3, 5])

1voto

rogeriopvl Points 9619

Pour éviter que les exceptions ne tuent votre application, vous devez attraper ces exceptions et les traiter comme vous le souhaitez, en définissant le comportement de votre application dans les situations où l'identifiant n'est pas trouvé.

begin
  current_user.comments.find(ids)
rescue
  #do something in case of exception found
end

Voici plus d'infos sur les exceptions dans Ruby.

0voto

mtfk Points 686

Vous pouvez également l'utiliser dans named_scope si vous voulez y mettre d'autres conditions.

par exemple inclure un autre modèle :

named_scope 'get_by_ids', lambda { |ids| { :include => [:comments], :conditions => ["comments.id IN ( ?)", ids] } }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X