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.inspectEstoy 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.
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