Je suis nouveau sur les rails. Ce que je vois, c'est qu'il existe de nombreuses façons de trouver un disque:
find_by_<columnname>(<columnvalue>)
find(:first, :conditions => { <columnname> => <columnvalue> }
where(<columnname> => <columnvalue>).first
Et il semble que tous finissent par générer exactement le même SQL. De plus, je pense que la même chose est vraie pour trouver plusieurs enregistrements:
find_all_by_<columnname>(<columnvalue>)
find(:all, :conditions => { <columnname> => <columnvalue> }
where(<columnname> => <columnvalue>)
Existe-t-il une règle empirique ou une recommandation sur laquelle utiliser?
la source
find_by
n'est pas obsolète, mais la syntaxe change un peu. Dufind_by_name("Bob")
aufind_by(:name, "Bob")
.find_by(name: "Bob")
find_by_...
obsolète, avez-vous une source? Il semblefind_by
etfind_by_...
sont toujours pris en charge dans Rails 4.où renvoie ActiveRecord :: Relation
Jetez maintenant un œil à l'implémentation de find_by:
Comme vous pouvez le voir, find_by est identique à where mais il ne renvoie qu'un seul enregistrement. Cette méthode doit être utilisée pour obtenir 1 enregistrement et où doit être utilisée pour obtenir tous les enregistrements avec certaines conditions.
la source
find_by
sauvera::RangeError
dewhere(*args)
et nul retour.Model.find
1- Paramètre: ID de l'objet à rechercher.
2- Si trouvé: Il renvoie l'objet (un seul objet).
3- Si non trouvé: déclenche une
ActiveRecord::RecordNotFound
exception.Model.find_by
1- Paramètre: clé / valeur
Exemple:
2- Si trouvé: il renvoie l'objet.
3- Si non trouvé: retourne
nil
.Remarque: si vous souhaitez augmenter l'
ActiveRecord::RecordNotFound
utilisationfind_by!
Model.where
1- Paramètre: identique à
find_by
2- Si trouvé: Il retourne
ActiveRecord::Relation
contenant un ou plusieurs enregistrements correspondant aux paramètres.3- Si non trouvé: il renvoie un Empty
ActiveRecord::Relation
.la source
Il y a une différence entre
find
etfind_by
quifind
renverra une erreur si elle n'est pas trouvée, alors quefind_by
retournera null.Parfois, il est plus facile à lire si vous avez une méthode comme
find_by email: "haha"
, par opposition à.where(email: some_params).first
.la source
Depuis Rails 4, vous pouvez faire:
qui est l'équivalent
find_by_name
dans Rails 3.À utiliser
#where
quand#find
et#find_by
ne suffit pas.la source
find_by
et nonfind_by_<column_name>
. J'en ai besoin pour répondre à quelqu'un.find_by_name
dans Rails 4? Autant que je sache, ce n'est pas obsolète .find_by(name: "Rob*")
La réponse acceptée couvre généralement tout, mais j'aimerais ajouter quelque chose, juste au cas où vous prévoyez de travailler avec le modèle d'une manière comme une mise à jour, et que vous récupérez un seul enregistrement (dont
id
vous ne savez pas), alorsfind_by
est la voie à suivre, car il récupère l'enregistrement et ne le met pas dans un tableaumais si vous utilisez,
where
vous ne pouvez pas le mettre à jour directementdans un tel cas, vous devrez le spécifier comme ceci
la source
En dehors de la réponse acceptée, ce qui suit est également valide
Model.find()
peut accepter un tableau d'identifiants et renverra tous les enregistrements qui correspondent.Model.find_by_id(123)
accepte également le tableau mais ne traitera que la première valeur d'identifiant présente dans le tableaula source
Les deux n ° 2 de vos listes sont obsolètes. Vous pouvez toujours l'utiliser
find(params[:id])
.Généralement,
where()
fonctionne dans la plupart des situations.Voici un excellent article: http://m.onkey.org/active-record-query-interface
la source
Les réponses données jusqu'à présent sont toutes correctes.
Cependant, une différence intéressante est que les
Model.find
recherches par identifiant; s'il est trouvé, il renvoie unModel
objet (juste un seul enregistrement) mais renvoie unActiveRecord::RecordNotFound
sinon.Model.find_by
est très similaire àModel.find
et vous permet de rechercher n'importe quelle colonne ou groupe de colonnes dans votre base de données, mais il renvoienil
si aucun enregistrement ne correspond à la recherche.Model.where
d'autre part, renvoie unModel::ActiveRecord_Relation
objet qui ressemble à un tableau contenant tous les enregistrements qui correspondent à la recherche . Si aucun enregistrement n'a été trouvé, il renvoie unModel::ActiveRecord_Relation
objet vide .J'espère que cela vous aidera à décider lequel utiliser à tout moment.
la source
Supposons que j'ai un modèle
User
User.find(id)
Renvoie une ligne où clé primaire = id. Le type de retour sera
User
object.User.find_by(email:"[email protected]")
Renvoie la première ligne avec l'attribut ou l'e-mail correspondant dans ce cas. Le type de retour sera à
User
nouveau objet.Remarque: -
User.find_by(email: "[email protected]")
est similaire àUser.find_by_email("[email protected]")
User.where(project_id:1)
Renvoie tous les utilisateurs de la table users où l'attribut correspond.
Ici, le type de retour sera
ActiveRecord::Relation
object.ActiveRecord::Relation
La classe inclut leEnumerable
module de Ruby afin que vous puissiez utiliser son objet comme un tableau et parcourir dessus.la source
La meilleure partie de l'utilisation de toute technologie open source est que vous pouvez en inspecter la longueur et l'étendue. Découvrez ce lien
find_by ~> Recherche le premier enregistrement correspondant aux conditions spécifiées. Il n'y a pas d'ordre implicite, donc si l'ordre est important, vous devez le spécifier vous-même. Si aucun enregistrement n'est trouvé, renvoie nil.
find ~> Recherche le premier enregistrement correspondant aux conditions spécifiées, mais si aucun enregistrement n'est trouvé, cela déclenche une exception mais cela est fait délibérément.
Consultez le lien ci-dessus, il contient toutes les explications et les cas d'utilisation des deux fonctions suivantes.
la source
Je recommanderai personnellement d'utiliser
la source