Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

396
Vistas
ruby find_by_sql parámetros de cadena que convierten el parámetro int en una cadena arroja un error en limit mysql 8

Tengo una aplicación web Ruby on Rails Rails 7.0.2.2 (versión Ruby 3.0.3) con una consulta a mysql 8.0.18 para macos10.14 en la base de datos x86_64 como:

 pagIndex = params[:pagIndex].to_i limitBoats = 20 offset = pagIndex * 20 values = Array.new indexValues = 0 sQuery = "SELECT DISTINCT b.id, ... FROM ... WHERE ... LIMIT ? OFFSET ?" values.insert(indexValues + 1, limitBoats) values.insert(indexValues + 2, offset) values.shift values.insert(0, sQuery) @result = Entity.find_by_sql(values)

Este código funciona perfectamente y se traduce en una consulta como:

 SELECT ... LIMIT '20' OFFSET '0';

donde limit y offset son cadenas.

Esto ha estado funcionando perfectamente durante años en mi ruby 2.4 anterior, rails 4 y mysql 5.5. Sin embargo, después de migrar a Ruby 3, Rails 7 y mysql 8, obtengo un error en los parámetros de límite y compensación, porque mysql espera un número entero.

Si simplemente elimino el '', la consulta funciona. ¿Cómo puedo hacer que esto funcione con find_by_sql?

Supongo que me estoy perdiendo algo ya que ni siquiera encuentro otros problemas como este.

Nota: el límite y el desplazamiento son parte de una paginación, por lo que provienen de variables y no puedo usar estos valores como enteros constantes.

ACTUALIZAR De acuerdo con el comentario de @muistooshort, solo para depurarlo más fácilmente, si solo creo un método con:

 @result = Entity.find_by_sql(['select * from entity limit ?', 11]) logger.debug "Entities=" + @result.inspect

Estoy obteniendo esta salida:

 DEBUG -- : Entity Load (0.5ms) select * from boats limit '11' Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.5ms | Allocations: 324) ActiveRecord::StatementInvalid (Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''11'' at line 1):

Como puede ver, está cambiando el int a string y mysql 8 se queja.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Totalmente extraño para mí, pero creé el siguiente error en Rails: https://github.com/rails/rails/issues/44853

y respondieron que tenían que hacer esto a propósito, por lo que ahora la única forma de enviar una consulta usando find_by_sql con límite es con una solución alternativa definida aquí: https://github.com/rails/rails/issues/44312

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda