74 votes

Rails .where contre .find

J'ai remarqué que la méthode Model.where renvoie toujours un tableau, même s'il n'y a qu'un seul résultat où la méthode Model.find ne le fait pas. Y a-t-il une raison quelconque pour cela? Je pensais que Model.where était la fonction préférée depuis Rails 3.X.

Devrais-je utiliser Model.find lorsque j'attends un seul résultat et Model.where lorsque j'attends plus d'un résultat?

118voto

Andrew Marshall Points 43955
  • where renvoie un ActiveRecord::Relation (pas un tableau, même si elle se comporte un peu comme un), qui est une collection d'objets de modèle. Si rien ne correspond aux conditions, il retourne simplement un vide relation.

  • find (et de ses dynamiques liés find_by_columnname méthodes) renvoie un seul objet de modèle, ou peut-être une collection d'objets de modèle dans un Tableau (pas de Relation). Si rien n'est trouvé, une ActiveRecord::RecordNotFound exception est levée.

Donc oui, si vous voulez seulement et s'attendre à un seul objet, à l'aide de find est plus facile, parce que sinon, vous devez appeler Model.where.first.

Notez également que certains de la dynamique de méthodes de recherche (ainsi que le vieux style de hachage options pour find) sont en train d'être obsolète à partir dans les Rails 4.0.

13voto

squixy Points 1146

En réalité, find_by prend un objet de modèle de where obtenu ActiveRecord::Relation

 def find_by(*args)
  where(*args).take
end
 

La source

6voto

iltempo Points 7276

Model.find utilise la colonne de clé primaire. Par conséquent, il y a toujours exactement un résultat, voire aucun. Utilisez-le lorsque vous recherchez un élément spécifique identifié par son identifiant.

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