Por que seu código não funciona?
O where
método retorna um objeto ActiveRecord :: Relation (age como um array que contém os resultados de where
), pode estar vazio, mas nunca estará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
Como testar se existe pelo menos um registro?
Opção 1: usando.exists?
if Business.exists?(user_id: current_user.id)
# same as Business.where(user_id: current_user.id).exists?
# ...
else
# ...
end
Opção 2: usando .present?
(ou .blank?
o oposto 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
Opção 3: atribuição de variável na instrução if
if business = Business.where(:user_id => current_user.id).first
business.do_some_stuff
else
# do something else
end
Esta opção pode ser considerada um cheiro de código por alguns linters (Rubocop por exemplo).
Opção 3b: Atribuição de variável
business = Business.where(user_id: current_user.id).first
if business
# ...
else
# ...
end
Você também pode usar em .find_by_user_id(current_user.id)
vez de.where(...).first
Melhor opção:
- Se você não usar o
Business
(s) objeto (s): Opção 1
- Se você precisar usar o
Business
(s) objeto (s): Opção 3
where
retornará um array vazio se não houver registros. E[]
não é igualnil