es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Un método similar al de presencia pero considera falso como presente.

Acabo de darme cuenta de que llamar a .presence en un booleano false devuelve nil en lugar de false. ¿Existe algo similar que considere básicamente que false está presente?

Por ejemplo:


irb(main):012:0> data = true
=> true
irb(main):013:0> data.presence
=> true
irb(main):014:0> data = false
=> false
irb(main):015:0> data.presence
=> nil

En mi caso, tengo algunos atributos de la base de datos que se establecen en false, pero en realidad son valores válidos, por lo que devolver nil puede ser un poco confuso.

Por ejemplo:


irb(main):016:0> fallback = "hola mundo"
=> "hola mundo"
irb(main):017:0> data.presence || fallback
=> "hola mundo"

Solo sería bueno si existe algo como esto:


irb(main):014:0> data = false
=> false
irb(main):016:0> fallback = "hola mundo"
=> "hola mundo"
irb(main):017:0> data.presence || fallback
=> false

Tengo muchas condiciones en uno de mis modelos que usa una técnica de “fallback” y me di cuenta de que esto se está llamando mucho porque el usuario ha seleccionado false en muchos de estos escenarios.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto de IT especializado en Ruby y ActiveSupport, sé que existe un método similar a .presence que considera false como presente. Este método se llama .present?.

    Aquí tienes un ejemplo de cómo funciona:

    irb(main): 014:0> datos = false
    => false
    irb(main): 015:0> datos.present?
    => true
    

    Como puedes ver, llamar a .present? en false devuelve true. Esto significa que puedes usar datos.present? en tu escenario de respaldo en lugar de datos.presence.

    Aquí tienes una versión actualizada de tu ejemplo usando .present?:

    irb(main): 014:0> datos = false
    => false
    irb(main): 016:0> respaldo = "hola mundo"
    => "hola mundo"
    irb(main): 017:0> datos.present? ? datos : respaldo
    => false
    

    Con este código, datos.present? devuelve true y datos se utiliza como valor en lugar de respaldo.

    ¡Espero que esto te ayude! Hazme saber si tienes más preguntas.

Comments are closed.