In meiner App kann ein Benutzer ein Unternehmen erstellen. Wenn sie die index
Aktion in meinem auslösen, BusinessesController
möchte ich überprüfen, ob ein Unternehmen mit Folgendem verbunden ist current_user.id
:
- Wenn ja: Zeigen Sie das Unternehmen an.
- Wenn nein: Zur
new
Aktion umleiten .
Ich habe versucht, dies zu verwenden:
if Business.where(:user_id => current_user.id) == nil
# no business found
end
Aber es gibt immer wahr zurück, auch wenn das Geschäft nicht existiert ...
Wie kann ich testen, ob ein Datensatz in meiner Datenbank vorhanden ist?
ruby-on-rails
ruby-on-rails-3
activerecord
exists
MrYoshiji
quelle
quelle
where
wird ein leeres Array zurückgegeben, wenn keine Datensätze vorhanden sind. Und[]
ist nicht gleichnil
unless Business.find_by_user_id(current_user.id)
?Antworten:
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ältwhere
). Es kann leer sein, wird es aber niemals seinnil
.Wie teste ich, ob mindestens ein Datensatz vorhanden ist?
Option 1: Verwenden
.exists?
Option 2: Verwenden
.present?
(oder.blank?
das Gegenteil von.present?
)Option 3: Variablenzuweisung in der if-Anweisung
Diese Option kann von einigen Lintern (z. B. Rubocop) als Codegeruch angesehen werden.
Option 3b: Variablenzuordnung
Sie können auch
.find_by_user_id(current_user.id)
anstelle von verwenden.where(...).first
Beste Option:
Business
Objekte nicht verwenden : Option 1Business
Objekte verwenden müssen: Option 3quelle
blank?
In diesem Fall verwende ich gerne
exists?
die von ActiveRecord bereitgestellte Methode:quelle
mit 'existiert?':
mit jedem?':
Wenn Sie etwas mit .where verwenden, vermeiden Sie Probleme mit Bereichen und verwenden Sie besser .unscoped
quelle
ActiveRecord # wobei ein ActiveRecord :: Relation-Objekt zurückgegeben wird (das niemals Null sein wird). Versuchen Sie es mit .empty? auf die Beziehung zu testen, ob es irgendwelche Datensätze zurückgibt.
quelle
Wenn Sie anrufen, erhalten
Business.where(:user_id => current_user.id)
Sie ein Array. Dieses Array enthält möglicherweise keine Objekte oder ein oder mehrere Objekte, ist jedoch nicht null. Somit wird die Prüfung == nil niemals wahr sein.Sie können Folgendes versuchen:
Sie überprüfen also die Anzahl der Elemente im Array und vergleichen sie mit Null.
oder Sie können versuchen:
Dies gibt eins oder null zurück.
quelle
quelle
Ich würde es so machen, wenn Sie eine Instanzvariable des Objekts benötigen, um damit zu arbeiten:
quelle