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.

Error de tipo al utilizar datamapper para consultar una propiedad Integer

Tengo un problema con las consultas en propiedades de tipo entero con datamapper.

Configuración de datamapping:

class Order
  include DataMapper::Resource
  storage_names[:default] = 'ORDER'

  property :order_id, Integer, :field => 'ORDER_ID', :key => true
  property :order_name, String, :field => 'ORDER_NAME'
  property :order_number, Integer, :field => 'ORDER_NUMBER'
end

En la base de datos tengo este registro:

Order: 1277 – “Order1277” – 7

Si quiero obtener una orden puedo hacer cosas como:

Order.first
Order.last
Order.first(order_name: "Order1277")

Esto me devuelve un objeto que puedo usar. Pero cuando intento lo siguiente, obtengo errores:

Order.first(order_id: 1277)
Order.first(order_number: 7)

El error que obtengo:

 TypeError:
   1277 no es un símbolo
 # data_objects/Command.java:261:in `execute_reader'

Estoy utilizando:
– jRuby 9.2.20
– Datamapper 1.2.0

Parece que solo puedo realizar consultas en propiedades de tipo cadena. Intenté convertir el entero en un símbolo, ya no obtengo un error pero no se encuentra ningún registro. Incluso intenté configurar el campo de id como cadena.

Order.all(order_id: '1277'.to_sym)

Entiendo que bajar la versión de jRuby podría ayudar, pero eso no es una opción.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que hay un problema al utilizar propiedades Integer en las consultas con Datamapper versión 1.2.0 y jRuby 9.2.20. El mensaje de error indica que el valor entero no es reconocido como un símbolo. La conversión del entero a un símbolo tampoco soluciona el problema.

    Una posible solución alternativa podría ser convertir las propiedades Integer a propiedades String en la configuración de Datamapper. Luego, las consultas en las propiedades String deberían funcionar como se espera.

    Por ejemplo, la clase Order podría ser configurada de la siguiente manera:

    class Order
      include DataMapper::Resource
      storage_names[:default] = 'ORDER'
    
      property :order_id, String, :field => 'ORDER_ID', :key => true
      property :order_name, String, :field => 'ORDER_NAME'
      property :order_number, String, :field => 'ORDER_NUMBER'
    end
    

    Luego, las consultas en order_id y order_number como strings deberían funcionar sin problemas:

    Order.first(order_id: '1277')
    Order.first(order_number: '7')
    

    Esta solución alternativa puede que no sea ideal, pero debería permitir realizar consultas en propiedades enteras hasta que se encuentre una solución adecuada.

Comments are closed.