Vérifier si l'enregistrement existe de contrôleur dans les Rails
Dans mon application, un Utilisateur peut créer une Entreprise. Quand ils déclenchent le index
dans mes BusinessesController
je veux vérifier si une Entreprise est liée à la current_user.id
:
- Si oui: affichage de l'entreprise.
- Si non: rediriger vers la
new
action.
J'ai essayé d'utiliser ce:
if Business.where(:user_id => current_user.id) == nil
# no business found
end
Mais il renvoie toujours vrai même lorsque l'entreprise n'existe pas...
Comment puis-je tester si il existe un enregistrement dans ma base de données?
- À l'aide de
where
retourne un tableau vide si il n'y a pas d'enregistrements. Et[]
n'est pas égal ànil
- Qu'en est juste un
unless Business.find_by_user_id(current_user.id)
? - double possible de Vérifier si ActiveRecord trouver renvoie un résultat
Vous devez vous connecter pour publier un commentaire.
Pourquoi ton code ne fonctionne pas?
La
where
méthode retourne un ActiveRecord::Relation objet (agit comme un tableau qui contient les résultats de lawhere
), il peut être vide, mais il ne sera jamaisnil
.Comment tester si au moins un enregistrement existe?
Option 1: À L'Aide De
.existe?
Option 2: à l'Aide de
.le présent?
(ou.vide?
, à l'opposé de.present?
)Option 3: affectation de Variable dans l'instruction if
Cette option peut être considérée comme une odeur de code par certains des linters (Rubocop par exemple).
Option 3b: affectation de Variable
Vous pouvez également utiliser
.find_by_user_id(current_user.id)
au lieu de.where(...).first
Meilleure option:
Business
objet(s): Option 1Business
objet(s): Option 3blank?
.first
avant.blank?
😉Dans ce cas, je tiens à utiliser le
exists?
méthode prévue par ActiveRecord:avec " existe?':
avec 'tout?':
Si vous utilisez quelque chose avec .où, être sûr d'éviter les ennuis avec des étendues et une meilleure utilisation
.non délimité
ActiveRecord#où sera de retour une ActiveRecord::Relation d'objet (qui ne sera jamais nul). Essayez d'utiliser .est-il vide? sur le rapport de test si il sera de retour de tous les enregistrements.
Lorsque vous appelez
Business.where(:user_id => current_user.id)
, vous obtiendrez un tableau. Ce Tableau peuvent ne pas avoir les objets ou l'un ou plusieurs objets, mais il n'est pas null. Ainsi, le check == nil ne sera jamais vrai.Vous pouvez essayer ce qui suit:
De sorte que vous vérifiez le nombre d'éléments dans le tableau et de les comparer à zéro.
ou vous pouvez essayer:
ce sera le retour de l'un ou nul.
Je voudrais le faire de cette façon, si vous avez besoin d'une variable d'instance de l'objet à travailler avec: