You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ActiveModel记录导出为INSERT SQL语句?Rails7适配问题

Rails 7 生成已有记录对应INSERT SQL语句的问题

Rails 6 中的原有实现

此前在Rails 6中,我一直用以下方法生成已有记录对应的INSERT SQL语句:

# 获取一条已有记录
record = MyRandomModel.take

# 生成该记录作为新记录插入时的INSERT SQL语句
model = record.class
values = record.send(:attributes_with_values, record.send(:attributes_for_create, model.column_names))

substitutes_and_binds = model.send(:_substitute_values, values)

insert_manager = model.arel_table.create_insert
insert_manager.insert substitutes_and_binds

sql = model.connection.unprepared_statement do
  model.connection.to_sql(insert_manager)
end

puts sql
#=> "INSERT...."

Rails 7 中的报错

但上述方法在Rails 7中无法运行,报错如下:

NoMethodError: undefined method `_substitute_values' for MyRandomModel:Class

尝试的改进方案(未达预期)

我尝试了以下代码:

record = MyRandomModel.take
model = record.class
table = model.arel_table
# 创建InsertManager对象
insert_manager = Arel::InsertManager.new(table)
insert_manager.insert(
  record.send(:attributes_with_values, model.column_names).transform_keys { |name| table[name] }
)
insert_manager.to_sql

但生成的是不带实际值的预编译INSERT语句。

内容的提问来源于stack exchange,提问作者Niels Kristian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:34:51