Если вы посмотрите, как update_all
реализован , вы не можете вызвать 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.