Ruby on rails rails-获取模型保存的SQL
我需要能够输出由Rails生成的SQL更新,而无需实际运行它们或保存记录。我将把SQL更新输出到一个文件中 有没有一种方法可以在Rails中实现这一点,而不使用字符串插值 是否可以执行以下操作:Ruby on rails rails-获取模型保存的SQL,ruby-on-rails,Ruby On Rails,我需要能够输出由Rails生成的SQL更新,而无需实际运行它们或保存记录。我将把SQL更新输出到一个文件中 有没有一种方法可以在Rails中实现这一点,而不使用字符串插值 是否可以执行以下操作: p = Post.where (something) p.some_value = some_new_value p.to_sql??? # how to generate the update statement 而不是: "UPDATE TABLE SET field_1 = #{new_fi
p = Post.where (something)
p.some_value = some_new_value
p.to_sql??? # how to generate the update statement
而不是:
"UPDATE TABLE SET field_1 = #{new_field} WHERE ID = " etc etc
摘自:
您可以通过以下方式实现此目标:
您可以找到所有Arel管理器,如delete_manager.rb、select_manager.rb和其他
读得好:取自@R.F.Nelson,并将其包装成一个方法。您可以使用您的模型作为参数调用\u update\u sql来获取sql
def to_update_sql(model)
return '' if model.changes.empty?
table = Arel::Table.new(model.class.table_name)
update_manager = Arel::UpdateManager.new(model.class)
update_manager.set(model.changes.map{|name, (_, val)| [table[name], val] })
.where(table[:id].eq(model.id))
.table(table)
return update_manager.to_sql
end
post = Post.first
post.some_value = xxxx
to_update_sql(post)
# => UPDATE `posts` SET `some_value` = xxx WHERE `posts`.`id` = 1
这确实很有趣,感谢您的回答,但是我仍然需要在update_manager.set中设置所有变量,这样就可以更容易地沿着字符串ITerporation路线进行。。。
def to_update_sql(model)
return '' if model.changes.empty?
table = Arel::Table.new(model.class.table_name)
update_manager = Arel::UpdateManager.new(model.class)
update_manager.set(model.changes.map{|name, (_, val)| [table[name], val] })
.where(table[:id].eq(model.id))
.table(table)
return update_manager.to_sql
end
post = Post.first
post.some_value = xxxx
to_update_sql(post)
# => UPDATE `posts` SET `some_value` = xxx WHERE `posts`.`id` = 1