Vérifiez si l’enregistrement existe depuis le contrôleur dans Rails

Dans mon application, un utilisateur peut créer une entreprise. Lorsqu’ils déclenchent l’action d’ index dans mon BusinessesController je veux vérifier si une entreprise est liée à current_user.id :

  • Si oui: affichez l’entreprise.
  • Si non: redirect vers la new action.

J’essayais d’utiliser ceci:

 if Business.where(:user_id => current_user.id) == nil # no business found end 

Mais cela revient toujours vrai même lorsque l’entreprise n’existe pas …

Comment puis-je tester si un enregistrement existe dans ma firebase database?

Pourquoi votre code ne fonctionne pas?

La méthode where renvoie un object ActiveRecord :: Relation (agit comme un tableau contenant les résultats du where ), il peut être vide mais il ne sera jamais nil .

 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 

Comment tester si au moins un enregistrement existe?

Option 1: Utilisation de .exists?

 if Business.exists?(user_id: current_user.id) # same as Business.where(user_id: current_user.id).exists? # ... else # ... end 

Option 2: Utiliser .present? (ou .blank? l’opposé de .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: affectation de la variable dans l’instruction if

 if business = Business.where(:user_id => current_user.id).first business.do_some_stuff else # do something else end 

Cette option peut être considérée comme une odeur de code par certains linters (Rubocop par exemple).

Option 3b: affectation de la variable

 business = Business.where(user_id: current_user.id).first if business # ... else # ... end 

Vous pouvez également utiliser .find_by_user_id(current_user.id) au lieu de .where(...).first


Meilleure option:

  • Si vous n’utilisez pas le ou Business objects Business : Option 1
  • Si vous devez utiliser le ou Business objects Business : Option 3

Dans ce cas, j’aime utiliser le exists? méthode fournie par ActiveRecord:

 Business.exists? user_id: current_user.id 

avec ‘existe?’:

 Business.exists? user_id: current_user.id #=> 1 or nil 

avec ‘any?’:

 Business.where(:user_id => current_user.id).any? #=> true or false 

Si vous utilisez quelque chose avec .where, veillez à éviter les problèmes avec les étendues et à mieux utiliser .unscoped

 Business.unscoped.where(:user_id => current_user.id).any? 

ActiveRecord # où retourne un object ActiveRecord :: Relation (qui ne sera jamais nul). Essayez d’utiliser .empty? sur la relation à tester si elle renverra des enregistrements.

Lorsque vous appelez Business.where(:user_id => current_user.id) vous obtiendrez un tableau. Ce tableau peut ne contenir aucun object ou un ou plusieurs objects, mais il ne sera pas nul. Ainsi, le chèque == nil ne sera jamais vrai.

Vous pouvez essayer ce qui suit:

 if Business.where(:user_id => current_user.id).count == 0 

Donc, vous vérifiez le nombre d’éléments dans le tableau et comparez-les à zéro.

ou vous pouvez essayer:

 if Business.find_by_user_id(current_user.id).nil? 

cela retournera un ou aucun.

 business = Business.where(:user_id => current_user.id).first if business.nil? # no business found else # business.ceo = "me" end 

Je le ferais de cette façon si vous aviez besoin d’une variable d’instance de l’object avec laquelle travailler:

 if @business = Business.where(:user_id => current_user.id).first #Do stuff else #Do stuff end