Ich bin neu in Schienen. Was ich sehe, dass es viele Möglichkeiten gibt, eine Aufzeichnung zu finden:
find_by_<columnname>(<columnvalue>)
find(:first, :conditions => { <columnname> => <columnvalue> }
where(<columnname> => <columnvalue>).first
Und es sieht so aus, als würden alle genau das gleiche SQL generieren. Ich glaube auch, dass das Gleiche für das Auffinden mehrerer Datensätze gilt:
find_all_by_<columnname>(<columnvalue>)
find(:all, :conditions => { <columnname> => <columnvalue> }
where(<columnname> => <columnvalue>)
Gibt es eine Faustregel oder eine Empfehlung für die Verwendung?
quelle
find_by
ist nicht veraltet, aber die Syntax ändert sich ein wenig. Vonfind_by_name("Bob")
bisfind_by(:name, "Bob")
.find_by(name: "Bob")
find_by_...
du eine Quelle? Es scheintfind_by
undfind_by_...
werden beide noch in Rails 4 unterstützt.Dabei wird ActiveRecord :: Relation zurückgegeben
Schauen Sie sich nun die Implementierung von find_by an:
Wie Sie sehen können, ist find_by dasselbe wie where , gibt jedoch nur einen Datensatz zurück. Diese Methode sollte verwendet werden, um 1 Datensatz abzurufen, und wo sollte verwendet werden, um alle Datensätze unter bestimmten Bedingungen abzurufen.
quelle
find_by
wird Rettung::RangeError
vonwhere(*args)
und Rückkehr gleich Null.Model.find
1- Parameter: ID des zu suchenden Objekts.
2- Wenn gefunden: Gibt das Objekt zurück (nur ein Objekt).
3- Wenn nicht gefunden: Löst eine
ActiveRecord::RecordNotFound
Ausnahme aus.Model.find_by
1- Parameter: Schlüssel / Wert
Beispiel:
2- Wenn gefunden: Gibt das Objekt zurück.
3- Wenn nicht gefunden: kehrt zurück
nil
.Hinweis: Wenn Sie möchten, dass die
ActiveRecord::RecordNotFound
Verwendungerhöhtwirdfind_by!
Model.where
1- Parameter: wie
find_by
2- Wenn gefunden: Es wird
ActiveRecord::Relation
ein oder mehrere Datensätze zurückgegeben, die den Parametern entsprechen.3- Wenn nicht gefunden: Es wird ein Leerzeichen zurückgegeben
ActiveRecord::Relation
.quelle
Es gibt einen Unterschied zwischen
find
undfind_by
darin, dassfind
ein Fehler zurückgegeben wird, wenn er nicht gefunden wird, währendfind_by
null zurückgegeben wird.Manchmal ist es einfacher zu lesen, wenn Sie eine Methode wie
find_by email: "haha"
im Gegensatz zu haben.where(email: some_params).first
.quelle
Seit Rails 4 können Sie:
Das ist das Äquivalent
find_by_name
in Rails 3.Verwenden Sie,
#where
wenn#find
und#find_by
nicht genug sind.quelle
find_by
und nichtfind_by_<column_name>
. Ich brauche es, um jemandem zu antworten.find_by_name
in Rails 4 verwenden sollten? Soweit ich weiß, ist es nicht veraltet .find_by(name: "Rob*")
Die akzeptierte Antwort deckt im Allgemeinen alles ab, aber ich möchte etwas hinzufügen, nur für den Fall, dass Sie planen, mit dem Modell auf eine Art und Weise wie das Aktualisieren zu arbeiten, und Sie einen einzelnen Datensatz abrufen (dessen
id
Sie nicht wissen), dannfind_by
ist der richtige Weg, weil es den Datensatz abruft und ihn nicht in ein Array legtaber wenn du verwendest
where
, können Sie es nicht direkt aktualisierenIn einem solchen Fall müssten Sie es so angeben
quelle
Neben der akzeptierten Antwort gilt auch Folgendes
Model.find()
kann ein Array von IDs akzeptieren und gibt alle übereinstimmenden Datensätze zurück.Model.find_by_id(123)
Akzeptieren Sie auch das Array, verarbeiten Sie jedoch nur den ersten im Array vorhandenen ID-Wertquelle
Beide # 2 in Ihren Listen sind veraltet. Sie können jedoch weiterhin verwenden
find(params[:id])
.Funktioniert im Allgemeinen
where()
in den meisten Situationen.Hier ist ein großartiger Beitrag: http://m.onkey.org/active-record-query-interface
quelle
Die bisher gegebenen Antworten sind alle in Ordnung.
Ein interessanter Unterschied besteht jedoch darin, dass
Model.find
nach ID gesucht wird. Wenn es gefunden wird, gibt es einModel
Objekt zurück (nur einen einzelnen Datensatz), löst aber einActiveRecord::RecordNotFound
anderes aus.Model.find_by
ist sehr ähnlich zuModel.find
und lässt Sie jede Spalte oder Gruppe von Spalten in Ihrer Datenbank durchsuchen, gibt jedoch zurück,nil
wenn kein Datensatz mit der Suche übereinstimmt.Model.where
Auf der anderen Seite wird einModel::ActiveRecord_Relation
Objekt zurückgegeben, das genau wie ein Array ist, das alle Datensätze enthält, die mit der Suche übereinstimmen . Wenn kein Datensatz gefunden wurde, wird ein leeresModel::ActiveRecord_Relation
Objekt zurückgegeben.Ich hoffe, diese helfen Ihnen bei der Entscheidung, welche Sie zu irgendeinem Zeitpunkt verwenden möchten.
quelle
Angenommen, ich habe ein Modell
User
User.find(id)
Gibt eine Zeile zurück, in der Primärschlüssel = ID ist. Der Rückgabetyp ist
User
Objekt.User.find_by(email:"[email protected]")
Gibt in diesem Fall die erste Zeile mit übereinstimmendem Attribut oder E-Mail zurück. Der Rückgabetyp ist wieder
User
Objekt.Hinweis: -
User.find_by(email: "[email protected]")
ähneltUser.find_by_email("[email protected]")
User.where(project_id:1)
Gibt alle Benutzer in der Benutzertabelle zurück, bei denen das Attribut übereinstimmt.
Hier wird der Rückgabetyp
ActiveRecord::Relation
Objekt sein.ActiveRecord::Relation
Die Klasse enthält RubysEnumerable
Modul, sodass Sie das Objekt wie ein Array verwenden und darauf durchlaufen können.quelle
Das Beste an der Arbeit mit Open Source-Technologien ist, dass Sie deren Länge und Breite überprüfen können. Kasse diesen Link
find_by ~> Findet den ersten Datensatz, der den angegebenen Bedingungen entspricht. Es gibt keine implizite Bestellung. Wenn die Bestellung wichtig ist, sollten Sie sie selbst angeben. Wenn kein Datensatz gefunden wird, wird null zurückgegeben.
find ~> Findet den ersten Datensatz, der den angegebenen Bedingungen entspricht. Wenn jedoch kein Datensatz gefunden wird, wird eine Ausnahme ausgelöst, die jedoch absichtlich ausgeführt wird.
Schauen Sie sich den obigen Link an, er enthält alle Erklärungen und Anwendungsfälle für die folgenden beiden Funktionen.
quelle
Ich werde persönlich empfehlen, zu verwenden
quelle