Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails-获取模型保存的SQL_Ruby On Rails - Fatal编程技术网

Ruby on rails rails-获取模型保存的SQL

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

我需要能够输出由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_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