In mijn app kan een gebruiker een bedrijf maken. Wanneer ze de index
Actie gebruiken in mijn BusinessesController
Ik wil controleren of een bedrijf gerelateerd is aan de current_user.id
:
- Zo ja: het bedrijf weergeven.
- indien nee: omleiden naar de
new
actie.
Ik probeerde dit te gebruiken:
if Business.where(:user_id => current_user.id) == nil
# no business found
end
Maar het retourneert altijd true, zelfs als het bedrijf niet bestaat …
Hoe kan ik testen of een record bestaat in mijn database?
Antwoord 1, Autoriteit 100%
Waarom uw code niet werkt?
De where
Method een ActiverEcord :: Relation -object retourneert (handelingen zoals een array die de resultaten van de where
), Het kan leeg zijn, maar het zal nooit 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
Hoe te testen als er ten minste één record bestaat?
Optie 1: met .exists?
if Business.exists?(user_id: current_user.id)
# same as Business.where(user_id: current_user.id).exists?
# ...
else
# ...
end
Optie 2: met .present?
(of .blank?
, de tegengesteld aan .present?
)
if Business.where(:user_id => current_user.id).present?
# less efficiant than using .exists? (see generated SQL for .exists? vs .present?)
else
# ...
end
Optie 3: Variabele opdracht in de IF-verklaring
if business = Business.where(:user_id => current_user.id).first
business.do_some_stuff
else
# do something else
end
Met deze optie kan worden beschouwd als een code die door sommige linters (rubocop bijvoorbeeld) wordt beschouwd.
Optie 3b: Variabele opdracht
business = Business.where(user_id: current_user.id).first
if business
# ...
else
# ...
end
U kunt ook .find_by_user_id(current_user.id)
gebruiken in plaats van .where(...).first
Beste optie:
- Als u de
Business
Object (en) niet gebruikt: Optie 1 - Als u de
Business
object (en) wilt gebruiken: Optie 3
Antwoord 2, Autoriteit 12%
In dit geval hou ik ervan om de exists?
METHODE VERSTREKT DOOR ACTIVERECORD:
Business.exists? user_id: current_user.id
Antwoord 3, Autoriteit 2%
Met ‘bestaat?’:
Business.exists? user_id: current_user.id #=> 1 or nil
met ‘elk?’:
Business.where(:user_id => current_user.id).any? #=> true or false
Als u iets gebruikt met. Waar, moet u problemen met scopes en beter gebruik vermijden
. Inscoped
Business.unscoped.where(:user_id => current_user.id).any?
Antwoord 4
Activerecord # Waar zal een activerecord retourneren :: relatieobject (die nooit nihil zal zijn). Probeer het te gebruiken? over de testen relatie als het alle records zal retourneren.
Antwoord 5
Wanneer u Business.where(:user_id => current_user.id)
krijgt u een array. Deze array kan geen objecten of een of vele objecten in zijn, maar het zal niet nul zijn. Zo zal de cheque == nul nooit waar zijn.
U kunt het volgende proberen:
if Business.where(:user_id => current_user.id).count == 0
Dus u controleert het aantal elementen in de array en vergelijk ze met nul.
of u kunt het proberen:
if Business.find_by_user_id(current_user.id).nil?
Hierdoor wordt er een of nul teruggestuurd.
Antwoord 6
business = Business.where(:user_id => current_user.id).first
if business.nil?
# no business found
else
# business.ceo = "me"
end
Antwoord 7
Ik zou het op deze manier doen als u een instantie-variabele van het object nodig had om mee te werken:
if @business = Business.where(:user_id => current_user.id).first
#Do stuff
else
#Do stuff
end