Quand j'ai un tableau d'identifiants, comme
ids = [2,3,5]
et je joue
Comment.find(ids)
tout fonctionne bien. Mais quand il y a un identifiant qui n'existe pas, j'obtiens une exception. Cela se produit généralement lorsque j'obtiens une liste d'identifiants qui correspondent à un filtre et que je fais quelque chose comme
current_user.comments.find(ids)
Cette fois, je peux avoir un identifiant de commentaire valide, qui n'appartient cependant pas à l'utilisateur donné, donc il n'est pas trouvé et j'obtiens une exception.
J'ai essayé find(:all, ids)
, mais il renvoie tous les enregistrements.
La seule façon dont je peux le faire maintenant est
current_user.comments.select { |c| ids.include?(c.id) }
Mais cela me semble être une solution super inefficace.
Existe-t-il un meilleur moyen de sélectionner l' ID dans Array sans obtenir une exception sur un enregistrement non existant?
la source
Array
au lieu d'unActiveRecord::Relation
, ce qui limite ce que vous pouvez en faire par la suite.Comment.where(id: [2, 3, 5])
renvoie unActiveRecord::Relation
.Mise à jour: cette réponse est plus pertinente pour Rails 4.x
Faites ceci:
Le côté fort de cette approche est qu'elle renvoie un
Relation
objet, auquel vous pouvez joindre plus de.where
clauses,.limit
clauses, etc., ce qui est très utile. Il autorise également les ID inexistants sans lever d'exceptions.La nouvelle syntaxe Ruby serait:
la source
where
syntaxe lors de la comparaison avec un tableau. Je pensais que je pourrais devoir coder le SQL avec uneIN
instruction, mais cela semble plus propre et remplace facilement les obsolètesscoped_by_id
.Si vous avez besoin de plus de contrôle (peut-être devez-vous indiquer le nom de la table), vous pouvez également effectuer les opérations suivantes:
la source
your_id_array
moment où vous récupérez les objets?ORDER BY
ne fonctionnera pas dans ma situation car la commande n'est pas basée sur un attribut. Cependant, il existe un moyen de le faire via SQL (donc c'est rapide) et quelqu'un a même créé un bijou pour cela. Consultez ce Q&A: stackoverflow.com/questions/801824/…Maintenant, les méthodes .find et .find_by_id sont obsolètes dans les rails 4. Nous pouvons donc utiliser ci-dessous:
Cela fonctionnera même si certains des identifiants n'existent pas. Cela fonctionne dans le
Aussi pour exclure les ID
la source
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é.
Voici plus d'informations sur les exceptions en rubis.
la source
Vous pouvez également l'utiliser dans named_scope si vous souhaitez y mettre d'autres conditions
par exemple, incluez un autre modèle:
la source