2017-09-06 1 views
0

Ich benutze Rails 5. Ich bin verwirrt über das Nachschlagen eines Datensatzes durch seine ID. Ich habe ein Modell, Benutzer, aber wenn ich mit einer Null-ID nachschlagen, bekomme ich ein Ergebnis ...Wie verhindere ich in Rails 5, dass find_by ein Ergebnis zurückgibt, wenn keines existiert?

2.4.0 :002 > User.find_by(nil) 
    User Load (0.5ms) SELECT "users".* FROM "users" LIMIT $1 [["LIMIT", 1]] 
=> #<User id: 2, provider: "google_oauth2", uid: "10152354902902839283465", email: "[email protected]", first_name: "Dave", last_name: "LastName", oauth_token: nil, oauth_expires: nil, created_at: "2017-08-28 19:49:18", updated_at: "2017-09-04 20:03:36", last_login: nil, currency_id: nil, email_confirmed: false, confirm_email_key: nil, confirm_key_expires: nil> 

Wie sehe ich einen aktiven Datensatz durch seine ID, aber habe es Null zurück, wenn keine ID die angegebenen Parameter übereinstimmt?

Antwort

1

Die Parameter, die Sie vorbei an find_by den Zustand definieren, um die Abfrage gelten - find_by(*args) ist nur where(*args).take.

Der Code, den Sie zeigen, User.find_by(nil), ist die gleiche wie in keinem Zustand vorbei ist, so entspricht User.where(nil).take oder User.take, in einer Abfrage entspricht select * from users limit 1 führt.

Wenn Sie von ID suchen und keinen Fehler haben geworfen, wenn Sie null oder einen Wert übergeben, der nicht existiert, zu verwenden:

User.find_by(id: id) 

Wenn Sie einen Fehler wollen geworfen werden, wenn die ID existiert nicht dann verwenden:

User.find(id) 
+0

Danke. Ich behaupte immer noch, dass User.find_by (id), wo ID ist nil noch Ergebnisse zurückgibt, ist sehr verwirrend. – Dave

+0

Ja ist es, aber es ist eine sehr unorthodoxe Art, die Methode zu verwenden. Die Methode erwartet, dass sie mit einer Bedingung versorgt wird, normalerweise in Form eines Hashes (obwohl ein SQL-Fragment verwendet werden könnte). –

0

eine Möglichkeit, dies zu tun zu verwenden wäre zu beginnen und Rettung.

begin 
    User.find(id) 
rescue ActiveRecord::RecordNotFound 
    p "Display error here" 
end 

Einstrich:

User.where(id: 'id').present? ? User.find('id') : nil 
+0

Danke, aber ich war auf der Suche nach einer One-Line-Lösung. Ein Datensatz nach seiner ID zu suchen, kann nicht so schwer sein. – Dave

0

Hier ist eine einzeilige Lösung:

User.where(id: id).first 

Dies setzt voraus, Ihre id Spalte keine Nullwerte enthalten ist (was in der Regel der Fall ist). Wenn nicht, können Sie tun:

User.where(id: id).where.not(id: nil).first 
+0

Nein, meine ID ist nicht NULL-fähig. Warum schlägt die in meiner Frage aufgeführte Aussage fehl? – Dave

+0

'User.where (id: id) .first' ist semantisch nicht ganz das selbe wie' find_by', da das 'first' eine' order by id' auf die Abfrage anwendet, die bei 'find_by' nicht vorhanden ist. Um ein einzelnes 'id' zu finden, wo ids eindeutig sind, ist das Ergebnis natürlich äquivalent, aber möglicherweise nicht für andere Arten von Spalten. –

Verwandte Themen