如何访问update_all生成的原始SQL语句(ActiveRecord方法)

问题描述 投票:1回答:1

我只是想知道是否有办法访问为update_all ActiveRecord请求执行的原始SQL。举个例子,举个简单的例子:

Something.update_all( ["to_update = ?"], ["id = ?" my_id] )

在rails控制台中,我可以看到原始SQL语句,所以我猜我可以通过某种方式访问​​它?

PS - 我对update_all特别感兴趣,不能将其改为其他任何东西。

谢谢!

ruby-on-rails ruby ruby-on-rails-3 rails-activerecord
1个回答
2
投票

如果你看看update_all is implemented的方式你不能像关系那样调用to_sql,因为它直接执行并返回一个整数(执行的行数)。

除非复制整个方法并更改最后一行,否则无法进入流程或获得所需结果:

module ActiveRecord
  # = Active Record \Relation
  class Relation
    def update_all_to_sql(updates)
      raise ArgumentError, "Empty list of attributes to change" if updates.blank?

      if eager_loading?
        relation = apply_join_dependency
        return relation.update_all(updates)
      end

      stmt = Arel::UpdateManager.new

      stmt.set Arel.sql(@klass.sanitize_sql_for_assignment(updates))
      stmt.table(table)

      if has_join_values? || offset_value
        @klass.connection.join_to_update(stmt, arel, arel_attribute(primary_key))
      else
        stmt.key = arel_attribute(primary_key)
        stmt.take(arel.limit)
        stmt.order(*arel.orders)
        stmt.wheres = arel.constraints
      end

      #- @klass.connection.update stmt, "#{@klass} Update All"
      stmt.to_sql
    end
  end
end

您看到日志语句的原因是它们在执行语句时由连接记录。虽然您可以覆盖日志记录,但对于来自单个AR方法的调用,它实际上无法实现。

© www.soinside.com 2019 - 2024. All rights reserved.