Warum funktioniert Ihr Code nicht?
where
Die Methode gibt einen Active :: Relation Objekt (wirkt wie eine Anordnung, die die Ergebnisse der where
enthält), es kann leer sein, aber es wird nie nil
sein.
Business.where(id: -1)
#=> returns an empty ActiveRecord::Relation (similar to an array)
Business.where(id: -1).nil? # (similar to == nil?)
#=> returns false
Business.where(id: -1).empty? # test if the array is empty (similar to .blank?)
#=> returns true
Wie, wenn mindestens ein Datensatz existiert testen?
Option 1: Mit.exists?
if Business.exists?(user_id: current_user.id)
# same as Business.where(user_id: current_user.id).exists?
# ...
else
# ...
end
Option 2: Mit.present?
(oder .blank?
, das Gegenteil von .present?
)
if Business.where(:user_id => current_user.id).present?
# less efficiant than using .exists? (see generated SQL for .exists? vs .present?)
else
# ...
end
Option 3: Variablenzuweisung in der if-Anweisung
if business = Business.where(:user_id => current_user.id).first
business.do_some_stuff
else
# do something else
end
Diese Option kann einen Code Geruch von einigen Linter (Rubocop zum Beispiel) in Betracht gezogen werden.
Option 3b: Variable Zuordnung
business = Business.where(user_id: current_user.id).first
if business
# ...
else
# ...
end
Sie auch .find_by_user_id(current_user.id)
statt .where(...).first
Die beste Option verwenden können:
- Wenn Sie nicht tun Verwenden Sie die
Business
Objekt (e): Option 1
- Wenn Sie das
Business
Objekt verwenden müssen (s): Option 3
Mit 'where' wird ein leeres Array zurückgegeben, wenn keine Datensätze vorhanden sind. Und '[]' ist nicht gleich "null" –
Was ist mit nur einem 'außer Business.find_by_user_id (current_user.id)'? – Hengjie
mögliches Duplikat von [Überprüfung, ob ActiveRecord find ein Ergebnis liefert] (http://stackoverflow.com/questions/2866473/checking-if-activerecord-find-returns-a-result) –