Schienen .wo gegen .find

75

Ich habe festgestellt, dass die Model.whereMethode immer ein Array zurückgibt, auch wenn es nur ein Ergebnis gibt, wo dies bei der Model.findMethode nicht der Fall ist. Gibt es dafür einen Grund? Ich dachte, Model.wherewar die bevorzugte Funktion seit Rails 3.X.

Sollte ich verwenden, Model.findwenn ich ein einzelnes Ergebnis Model.whereerwarte und wenn ich mehr als ein Ergebnis erwarte?

AdamB
quelle

Antworten:

120
  • whereGibt ein ActiveRecord::Relation(kein Array, obwohl es sich ähnlich verhält) zurück, bei dem es sich um eine Sammlung von Modellobjekten handelt. Wenn nichts den Bedingungen entspricht, wird einfach eine leere Beziehung zurückgegeben.

  • find(und die zugehörigen dynamischen find_by_columnnameMethoden) gibt ein einzelnes Modellobjekt zurück. Wenn nichts gefunden wird, wird eine ActiveRecord::RecordNotFoundAusnahme ausgelöst (jedoch nicht bei den dynamischen find_by_Methoden).

    Während findein Array von Datensätzen - keine Beziehung - zurückgegeben werden kann, wenn eine Liste von IDs angegeben wird, wird die Verwendung whereseit Rails 3 bevorzugt. Viele ähnliche Verwendungen von findsind jetzt veraltet oder vollständig verschwunden .

Also ja, wenn Sie nur ein einzelnes Objekt wollen und erwarten, ist die Verwendung findeinfacher, da Sie sonst aufrufen müssen Model.where.first.

Beachten Sie, dass Hash-Optionen im alten Stil für findund viele dynamische find_Methoden ab Rails 4.0 veraltet sind ( siehe relevante Versionshinweise ).

Andrew Marshall
quelle
Ich denke, das findkann mehrere Objekte in einem Array zurückgeben - versuchen User.find [1,2,3](findet Benutzer mit den IDs 1, 2 und 3) ... aber ja, ich denke, Andrew hat Recht mit dem Rest
Klump
3
@klump Yup, das kann es, User.where(id: [1, 2, 3])wird aber in diesem Fall bevorzugt, also habe ich es nicht einmal in Betracht gezogen. Wie immer empfehle ich, die API-Dokumentation zu lesen (auf die ich in meiner Antwort verwiesen habe), da sie die detailliertesten Informationen enthält.
Andrew Marshall
Aber .find(:all, ...)gibt ein Array. Was ist der Unterschied zwischen Finden und Wo?
HighBandWidth
@highBandWidth Siehe obige Kommentare. Ich habe auch meine Antwort aktualisiert. wheregibt kein Array zurück (obwohl Model.where(...).classes lügt und sagt, dass es ist).
Andrew Marshall
13

Nimmt tatsächlich find_byein Modellobjekt von whereerhaltenActiveRecord::Relation

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

Quelle

Kamil Lelonek
quelle
4
Beachten Sie, dass find_by erst in Rails 4 hinzugefügt wurde (die ursprüngliche Frage wurde mit Rails 3 markiert).
Steve
6

Model.findverwendet die Primärschlüsselspalte. Daher gibt es immer genau ein oder kein Ergebnis. Verwenden Sie es, wenn Sie nach einem bestimmten Element suchen, das durch seine ID gekennzeichnet ist.

iltempo
quelle
7
Nicht wenn du es tust .find(:conditions => {:col_name => some_vals}).
HighBandWidth