【问题标题】:to_sql not working on update_attributes or .saveto_sql 不适用于 update_attributes 或 .save
【发布时间】:2012-10-23 19:09:39
【问题描述】:

我正在寻找一种方法来存储在更新或创建操作中生成的 sql 字符串。我尝试将.to_sql 附加到update_attributes 的末尾,但它返回TrueClass 错误(或类似的东西)。有什么我遗漏的吗?

【问题讨论】:

  • 我不认为这是可能的,因为我不这样做,因为如果我错了,arel 从来都不是用于更新/删除逻辑的,请纠正我
  • 你为什么要把 SQL 存入数据库?
  • 所以我可以稍后将它作为 API 端点引用,以返回在“x”日期之间运行的所有查询,然后让这些查询在使用 sqlite 的移动应用程序上运行(主数据库是 mysql)。基本上是一种将移动应用程序与 mysql 数据库中的内容同步的方法。
  • 您在尝试将 MySQL SQL 提供给 SQLite 时可能会遇到问题。
  • 也许,但查询将非常基本 - 插入、更新和删除。没什么太花哨的。

标签: ruby ruby-on-rails-3


【解决方案1】:

简而言之-您需要覆盖 ActiveRecord 执行方法。你在那里 可以为日志添加任何逻辑。

connection = ActiveRecord::Base.connection
class << connection
  alias :original_exec :execute
  def execute(sql, *name)
    # try to log sql command but ignore any errors that occur in this block
    # we log before executing, in case the execution raises an error
    begin
        file = File.open(RAILS_ROOT + "/log/sql.txt",'a'){|f| f.puts Time.now.to_s+": "+sql}
    rescue Exception => e
      ;
    end
    # execute original statement
    original_exec(sql, *name)
  end
end

学分:

https://stackoverflow.com/a/1629474/643500

https://stackoverflow.com/a/1640560/643500

【讨论】:

  • 就像那个人在原帖上说的,你会把这个放在哪里?
  • 你可以把它放在你喜欢的任何地方,真的。就个人而言,我认为它的初始化器是有道理的,但这是一个品味问题。
  • 感谢您的回复。假设我把它放在初始化程序中,我将如何“调用”它以便我可以记录查询?对我来说,上面的代码意味着它每次都会运行。我希望在许多控制器中的某些操作上运行这样的方法。
  • 是的,该函数将捕获每个查询。您必须将其过滤到要记录的类\方法。这是最接近 Rails 生成的查询。如果您只是想处理一些方法,您可以查看日志并编写一个自定义方法,该方法将生成 sql 字符串以执行相同的操作。不会很简单。因此,从活动记录中捕获生成的 rails 查询,过滤对象/方法,然后最后保存数据是最简单的,并且可以保证匹配生成的查询。
【解决方案2】:

这些方法都返回一个布尔值。您不能在布尔值上调用 to_sql

【讨论】:

  • 我就是这么想的。有什么方法可以捕获执行的 sql 吗?显然它会在日志文件中输出,但我希望在执行时将字符串存储在数据库中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多