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:
parent
162e1d8df3
commit
963c930814
5 changed files with 25 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -11,6 +11,10 @@ module Arel
|
|||
self
|
||||
end
|
||||
|
||||
def key= key
|
||||
@ast.key = key
|
||||
end
|
||||
|
||||
def order *expr
|
||||
@ast.orders = expr
|
||||
self
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue