In meinem aktuellen Rails-Programm verwende ich sowas
user = User.find(10)
Wenn es keinen Benutzer mit der ID = 10 gibt, habe ich eine Ausnahme wie:
ActiveRecord::RecordNotFound: Couldn't find User with ID=10
Kann ich Null bekommen, anstatt Ausnahmen zu erzeugen, wenn ich also etwas mache:
unless user = Challenge.find(10)
puts "some error msg"
end
Ich möchte nur Null erhalten, wenn keine Datensätze vorhanden sind, und ich möchte nicht mit begin/rescue arbeiten
Vielen Dank
Ja, mach einfach:
Challenge.find_by_id(10)
Für die Schienen 4 und 5:
Challenge.find_by(id: 10)
In Rails 4 wurden dynamische Finder - wie find_by_id
-, der in der akzeptierten Antwort verwendet wurde, nicht mehr unterstützt.
In Zukunft sollten Sie die neue Syntax verwenden:
Challenge.find_by id: 10
sie können dies etwas hackig machen, verwenden Sie einfach die ActiveRecord Query Interface.
dies gibt Null zurück, anstatt eine Ausnahme zu erzeugen
User.where(:id => 10).first
Warum fangen Sie nicht einfach die Ausnahme? Ihr Fall sieht genau so aus, für welche Ausnahmen gemacht wurden:
begin
user = User.find(10)
rescue ActiveRecord::RecordNotFound
puts "some error msg"
end
Wenn Sie den Fehler im Rettungsblock beheben möchten (z. B. durch Festlegen eines Platzhalterbenutzers (Nullmuster)), können Sie mit Ihrem Code unterhalb dieses Blocks fortfahren. Ansonsten können Sie einfach Ihren gesamten Code für den "glücklichen Fall" in den Block zwischen "Beginn" und "Rettung" einfügen.
Sie können dies ausprobieren Challenge.exists?(10)
Für diejenigen, die mit mongoid zu kämpfen haben, stellt sich heraus, dass beide find
- und find_by
-Methoden eine Ausnahme auslösen - unabhängig von Ihrer Rails-Version!
Es gibt eine Option (nämlich raise_not_found_error), die auf false gesetzt werden kann, aber wenn falsey die find
-Methode macht, löst dies auch keine Ausnahme aus.
Daher ist die Lösung für mongoide Benutzer der ekelhafte Code:
User.where(id: 'your_id').first # argghhh
genauso einfach wie:
user = User.find(10) rescue nil
Sie können find_by mit dem erforderlichen Attribut (in Ihrem Fall der ID) verwenden. Wenn Sie die angegebene ID nicht finden, wird ein Fehler ausgegeben, der keine Fehler angibt.
user = Challenge.find_by_id(id_value)
oder du könntest das neue Format verwenden:
user = Challenge.find_by id: id_value
Sie könnten auch where verwenden, aber Sie müssen wissen, wo eine aktive Datensatzrelation mit null oder mehr Datensätzen zurückgegeben wird, die Sie zuerst verwenden müssen, um nur einen Datensatz oder null zurückzugeben, falls keine Datensätze zurückgegeben werden.
user = Challenge.where(id: id_value).first