En mi aplicación, un usuario puede crear una empresa. Cuando desencadenan la indexacción en mi BusinessesControllerquiero comprobar si un negocio está relacionado con current_user.id:
- En caso afirmativo: muestre el negocio.
- Si no: redirige a la
newacció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

wheredevolverá una matriz vacía si no hay registros. Y[]no es igualnilunless Business.find_by_user_id(current_user.id)?Respuestas:
¿Por qué tu código no funciona?
El
wheremé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 # ... endOpció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 # ... endOpció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 endEsta 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 # ... endTambién puede usar en
.find_by_user_id(current_user.id)lugar de.where(...).firstMejor opción:
Business(los) objeto (s): Opción 1Businessobjeto (s): Opción 3fuente
blank?En este caso, me gusta usar el
exists?método proporcionado por ActiveRecord:Business.exists? user_id: current_user.idfuente
con 'existe?':
Business.exists? user_id: current_user.id #=> 1 or nil¿con cualquier?':
Business.where(:user_id => current_user.id).any? #=> true or falseSi 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 == 0Entonces, 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" endfuente
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 endfuente