En mi aplicación, un usuario puede crear una empresa. Cuando desencadenan la index
acción en mi BusinessesController
quiero comprobar si un negocio está relacionado con current_user.id
:
- En caso afirmativo: muestre el negocio.
- Si no: redirige a la
new
acción.
Estaba tratando de usar esto:
if Business.where(:user_id => current_user.id) == nil
# no business found
end
Pero siempre vuelve verdadero incluso cuando el negocio no existe ...
¿Cómo puedo probar si existe un registro en mi base de datos?
ruby-on-rails
ruby-on-rails-3
activerecord
exists
MrYoshiji
fuente
fuente
where
devolverá una matriz vacía si no hay registros. Y[]
no es igualnil
unless Business.find_by_user_id(current_user.id)
?Respuestas:
¿Por qué tu código no funciona?
El
where
método devuelve un objeto ActiveRecord :: Relation (actúa como una matriz que contiene los resultados delwhere
), puede estar vacío pero nunca lo 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
¿Cómo probar si existe al menos un registro?
Opción 1: usar
.exists?
if Business.exists?(user_id: current_user.id) # same as Business.where(user_id: current_user.id).exists? # ... else # ... end
Opción 2: Usar
.present?
(o.blank?
lo contrario 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
Opción 3: Asignación de variable en la instrucción if
if business = Business.where(:user_id => current_user.id).first business.do_some_stuff else # do something else end
Esta opción puede ser considerada un olor a código por algunos linters (Rubocop por ejemplo).
Opción 3b: asignación de variable
business = Business.where(user_id: current_user.id).first if business # ... else # ... end
También puede usar en
.find_by_user_id(current_user.id)
lugar de.where(...).first
Mejor opción:
Business
(los) objeto (s): Opción 1Business
objeto (s): Opción 3fuente
blank?
En este caso, me gusta usar el
exists?
método proporcionado por ActiveRecord:Business.exists? user_id: current_user.id
fuente
con 'existe?':
Business.exists? user_id: current_user.id #=> 1 or nil
¿con cualquier?':
Business.where(:user_id => current_user.id).any? #=> true or false
Si usa algo con .where, asegúrese de evitar problemas con los visores y utilice mejor .
Business.unscoped.where(:user_id => current_user.id).any?
fuente
ActiveRecord # donde devolverá un objeto ActiveRecord :: Relation (que nunca será nulo). ¿Intenta usar .empty? en la relación para probar si devolverá algún registro.
fuente
Cuando llame
Business.where(:user_id => current_user.id)
, obtendrá una matriz. Esta matriz puede no tener objetos o tener uno o muchos objetos, pero no será nula. Por tanto, la comprobación == nil nunca será verdadera.Puedes probar lo siguiente:
if Business.where(:user_id => current_user.id).count == 0
Entonces, verifica el número de elementos en la matriz y los compara con cero.
o puedes probar:
if Business.find_by_user_id(current_user.id).nil?
esto devolverá uno o nulo.
fuente
business = Business.where(:user_id => current_user.id).first if business.nil? # no business found else # business.ceo = "me" end
fuente
Lo haría de esta manera si necesitara una variable de instancia del objeto para trabajar:
if @business = Business.where(:user_id => current_user.id).first #Do stuff else #Do stuff end
fuente