it-swarm.com.de

find () mit nil, wenn keine Datensätze vorhanden sind

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 

81
Eqbal

Ja, mach einfach:

Challenge.find_by_id(10)

Für die Schienen 4 und 5:

Challenge.find_by(id: 10)
144
apneadiving

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
29
hattila91

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
14
beanie

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.

5
morgler

Sie können dies ausprobieren Challenge.exists?(10)

4
tonymarschall

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
3

genauso einfach wie:

user = User.find(10) rescue nil
1
mohamed-ibrahim

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
0
Alanoud Just