ruby find_by_sql 字符串参数将 int 参数转换为字符串在限制中引发错误 mysql 8

ruby find_by_sql string parameters converting int parameter into string throws error in limit mysql 8

我在 rails Rails 7.0.2.2 webapp(ruby 版本 3.0.3)上有一个 ruby,查询 mysql 8.0。 x86_64 数据库上的 macos10.14 为 18,如:

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)

此代码运行良好,正在转换为如下查询:

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

其中 limit 和 offset 是字符串。

在我之前的 ruby 2.4、rails 4 和 mysql 5.5 中,这多年来一直运行良好。但是,在迁移到 ruby 3、Rails 7 和 mysql 8 之后,我在 limit 和 offset 参数中遇到错误,因为 mysql 需要一个整数。

如果我只删除 '',查询就可以了。我怎样才能使它与 find_by_sql 一起工作?

我想我遗漏了一些东西,因为我什至没有发现任何其他类似的问题。

注意:limit 和 offset 是分页的一部分,因此它们来自变量,我不能只将这些值用作常量整数。

更新 根据@muistooshort 评论,只是为了更容易调试,如果我只是创建一个方法:

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

我得到这个输出:

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):

如您所见,它将 int 更改为 string 并且 mysql 8 个抱怨。

对我来说完全陌生,但我在 Rails 中创建了下一个错误: https://github.com/rails/rails/issues/44853

他们回答说他们需要故意这样做,所以现在使用带限制的 find_by_sql 发送查询的唯一方法是使用此处定义的解决方法: https://github.com/rails/rails/issues/44312