如何将 ActiveModel 记录转储为 INSERT SQL 语句?

问题描述 投票:0回答:1
之前在 Rails 6 中我一直在做:

# I have an existing record record = MyRandomModel.take # Now I wanna get the INSERT SQL which would have been generated and executed on the DB in case it was a new record.... 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 中不起作用。它失败并出现以下错误:

NoMethodError: undefined method `_substitute_values' for MyRandomModel:Class

更新: 我已经走到这一步了:

record = MyRandomModel.take model = record.class table = model.arel_table # Create an InsertManager object 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 语句,但没有实际值...

ruby-on-rails activerecord ruby-on-rails-7 arel
1个回答
0
投票
好吧,我想我明白了:

record = MyRandomModel.take model = record.class table = model.arel_table # Create an InsertManager object insert_manager = Arel::InsertManager.new(table) insert_manager.insert( record.send(:attributes_with_values, model.column_names).transform_keys { |name| table[name] } ) model.connection.unprepared_statement do model.connection.to_sql(insert_manager) end
    
© www.soinside.com 2019 - 2024. All rights reserved.