Warum funktioniert Ihr Code nicht?
Die where
Methode gibt ein ActiveRecord :: Relation- Objekt zurück (verhält sich wie ein Array, das die Ergebnisse von enthält where
). Es kann leer sein, wird es aber niemals seinnil
.
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 teste ich, ob mindestens ein Datensatz vorhanden ist?
Option 1: Verwenden.exists?
if Business.exists?(user_id: current_user.id)
# same as Business.where(user_id: current_user.id).exists?
# ...
else
# ...
end
Option 2: Verwenden .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 von einigen Lintern (z. B. Rubocop) als Codegeruch angesehen werden.
Option 3b: Variablenzuordnung
business = Business.where(user_id: current_user.id).first
if business
# ...
else
# ...
end
Sie können auch .find_by_user_id(current_user.id)
anstelle von verwenden.where(...).first
Beste Option:
- Wenn Sie die
Business
Objekte nicht verwenden : Option 1
- Wenn Sie die
Business
Objekte verwenden müssen: Option 3
where
wird ein leeres Array zurückgegeben, wenn keine Datensätze vorhanden sind. Und[]
ist nicht gleichnil