1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

requiring that the primary key be set on the UpdateManager so that databases which do not support UPDATE with LIMIT will work

This commit is contained in:
Aaron Patterson 2010-12-24 15:48:33 -07:00
parent 162e1d8df3
commit 963c930814
5 changed files with 25 additions and 6 deletions

View file

@ -6,7 +6,7 @@ module Arel
um = UpdateManager.new @engine
if Nodes::SqlLiteral === values
relation = @ctx.froms
relation = @ctx.from
else
relation = values.first.first.relation
end

View file

@ -2,13 +2,15 @@ module Arel
module Nodes
class UpdateStatement < Arel::Nodes::Node
attr_accessor :relation, :wheres, :values, :orders, :limit
attr_accessor :key
def initialize
@relation = nil
@wheres = []
@values = []
@orders = []
@limit = nil
@orders = []
@limit = nil
@key = nil
end
def initialize_copy other

View file

@ -11,6 +11,10 @@ module Arel
self
end
def key= key
@ast.key = key
end
def order *expr
@ast.orders = expr
self

View file

@ -42,20 +42,31 @@ module Arel
if o.orders.empty? && o.limit.nil?
wheres = o.wheres
else
key = o.key
unless key
warn(<<-eowarn) if $VERBOSE
(#{caller.first}) Using UpdateManager without setting UpdateManager#key is
deprecated and support will be removed in ARel 3.0.0. Please set the primary
key on UpdateManager using UpdateManager#key=
eowarn
key = o.relation.primary_key
end
wheres = o.wheres
stmt = Nodes::SelectStatement.new
core = stmt.cores.first
core.froms = o.relation
core.projections = [o.relation.primary_key]
core.projections = [key]
stmt.limit = o.limit
stmt.orders = o.orders
wheres = [Nodes::In.new(o.relation.primary_key, [stmt])]
wheres = [Nodes::In.new(key, [stmt])]
end
[
"UPDATE #{visit o.relation}",
("SET #{o.values.map { |value| visit value }.join ', '}" unless o.values.empty?),
("WHERE #{wheres.map { |x| visit x }.join ' AND '}" unless wheres.empty?)
("WHERE #{wheres.map { |x| visit x }.join ' AND '}" unless wheres.empty?),
].compact.join ' '
end

View file

@ -480,6 +480,7 @@ module Arel
manager.from table
manager.take 1
stmt = manager.compile_update(SqlLiteral.new('foo = bar'))
stmt.key = table['id']
stmt.to_sql.must_be_like %{
UPDATE "users" SET foo = bar
@ -494,6 +495,7 @@ module Arel
manager.from table
manager.order :foo
stmt = manager.compile_update(SqlLiteral.new('foo = bar'))
stmt.key = table['id']
stmt.to_sql.must_be_like %{
UPDATE "users" SET foo = bar