Controleer of het record bestaat uit de controller in rails

In mijn app kan een gebruiker een bedrijf maken. Wanneer ze de indexActie gebruiken in mijn BusinessesControllerIk wil controleren of een bedrijf gerelateerd is aan de current_user.id:

  • Zo ja: het bedrijf weergeven.
  • indien nee: omleiden naar de newactie.

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 whereMethod 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 BusinessObject (en) niet gebruikt: Optie 1
  • Als u de Businessobject (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

Other episodes