mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Make update_all
preparable
Before: ``` Pet Update All (0.8ms) UPDATE `pets` LEFT OUTER JOIN `toys` ON `toys`.`pet_id` = `pets`.`pet_id` SET `pets`.`name` = 'Bob' WHERE `toys`.`name` = ? [["name", "Bone"]] ``` After: ``` Pet Update All (1.1ms) UPDATE `pets` LEFT OUTER JOIN `toys` ON `toys`.`pet_id` = `pets`.`pet_id` SET `pets`.`name` = ? WHERE `toys`.`name` = ? [["name", "Bob"], ["name", "Bone"]] ```
This commit is contained in:
parent
140ec68c0d
commit
8e123847e8
2 changed files with 18 additions and 2 deletions
|
@ -348,10 +348,14 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
stmt = Arel::UpdateManager.new
|
||||
|
||||
stmt.set Arel.sql(@klass.sanitize_sql_for_assignment(updates, table.name))
|
||||
stmt.table(table)
|
||||
|
||||
if updates.is_a?(Hash)
|
||||
stmt.set _substitute_values(updates)
|
||||
else
|
||||
stmt.set Arel.sql(klass.sanitize_sql_for_assignment(updates, table.name))
|
||||
end
|
||||
|
||||
if has_join_values? || offset_value
|
||||
@klass.connection.join_to_update(stmt, arel, arel_attribute(primary_key))
|
||||
else
|
||||
|
@ -625,6 +629,14 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
private
|
||||
def _substitute_values(values)
|
||||
values.map do |name, value|
|
||||
attr = arel_attribute(name)
|
||||
type = klass.type_for_attribute(attr.name)
|
||||
bind = predicate_builder.build_bind_attribute(attr.name, type.cast(value))
|
||||
[attr, bind]
|
||||
end
|
||||
end
|
||||
|
||||
def has_join_values?
|
||||
joins_values.any? || left_outer_joins_values.any?
|
||||
|
|
|
@ -37,6 +37,10 @@ module Arel # :nodoc: all
|
|||
visit o.expr, collector
|
||||
end
|
||||
|
||||
def visit_Arel_Nodes_UnqualifiedColumn(o, collector)
|
||||
visit o.expr, collector
|
||||
end
|
||||
|
||||
###
|
||||
# :'(
|
||||
# http://dev.mysql.com/doc/refman/5.0/en/select.html#id3482214
|
||||
|
|
Loading…
Reference in a new issue