如何将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
相关产品推荐
相关产品推荐

