在 Rails 3.2.13 中测试:我想我这次做对了,这次肯定不会持久化到数据库。它也不会触发验证或回调,因此除非您以其他方式调用它们,否则它们更改的任何内容都不会出现在结果中。
将它保存在 lib 中作为 insert_sqlable.rb 然后你可以
#in your models or you can send it to ActiveRecord::Base
include InsertSqlable
然后就是model.insert_sql来看看。
#lib/insert_sqlable
module InsertSqlable
def insert_sql
values = arel_attributes_values
primary_key_value = nil
if self.class.primary_key && Hash === values
primary_key_value = values[values.keys.find { |k|
k.name == self.class.primary_key
}]
if !primary_key_value && connection.prefetch_primary_key?(self.class.table_name)
primary_key_value = connection.next_sequence_value(self.class.sequence_name)
values[self.class.arel_table[self.class.primary_key]] = primary_key_value
end
end
im = self.class.arel_table.create_insert
im.into self.class.arel_table
conn = self.class.connection
substitutes = values.sort_by { |arel_attr,_| arel_attr.name }
binds = substitutes.map do |arel_attr, value|
[self.class.columns_hash[arel_attr.name], value]
end
substitutes.each_with_index do |tuple, i|
tuple[1] = conn.substitute_at(binds[i][0], i)
end
if values.empty? # empty insert
im.values = Arel.sql(self.class.connectionconnection.empty_insert_statement_value)
else
im.insert substitutes
end
conn.to_sql(im,binds)
end
end
原来代码在 ActiveRecord::Relation 中而不是 ActiveRecord::Persistence 中。唯一显着的变化是生成 sql 而不是执行它的最后一行。