No meu aplicativo, um usuário pode criar um negócio. Quando eles acionam a index
ação no meu BusinessesController
, quero verificar se um negócio está relacionado a current_user.id
:
- Se sim: mostre o negócio.
- Se não: redirecione para a
new
ação.
Eu estava tentando usar isto:
if Business.where(:user_id => current_user.id) == nil
# no business found
end
Mas sempre retorna verdadeiro mesmo quando o negócio não existe ...
Como posso testar se existe um registro em meu banco de dados?
ruby-on-rails
ruby-on-rails-3
activerecord
exists
MrYoshiji
fonte
fonte
where
retornará um array vazio se não houver registros. E[]
não é igualnil
unless Business.find_by_user_id(current_user.id)
?Respostas:
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 dewhere
), pode estar vazio, mas nunca estaránil
.Como testar se existe pelo menos um registro?
Opção 1: usando
.exists?
Opção 2: usando
.present?
(ou.blank?
o oposto de.present?
)Opção 3: atribuição de variável na instrução if
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
Você também pode usar em
.find_by_user_id(current_user.id)
vez de.where(...).first
Melhor opção:
Business
(s) objeto (s): Opção 1Business
(s) objeto (s): Opção 3fonte
blank?
Neste caso, gosto de usar o
exists?
método fornecido pelo ActiveRecord:fonte
com 'existe?':
com qualquer?':
Se você usar algo com .where, certifique-se de evitar problemas com escopos e usar melhor .unscoped
fonte
ActiveRecord # onde retornará um objeto ActiveRecord :: Relation (que nunca será nulo). Tente usar .empty? na relação para testar se ele retornará algum registro.
fonte
Quando você ligar,
Business.where(:user_id => current_user.id)
você obterá um array. Este Array pode não ter objetos ou um ou mais objetos, mas não será nulo. Portanto, a verificação == nil nunca será verdadeira.Você pode tentar o seguinte:
Portanto, você verifica o número de elementos na matriz e os compara a zero.
ou você pode tentar:
isso retornará um ou nulo.
fonte
fonte
Eu faria isso dessa forma se você precisasse de uma variável de instância do objeto para trabalhar:
fonte