提交 c66fcc2b 编写于 作者: R Raimonds Simanovskis

pass primary key name and value to ActiveRecord adapter insert method

necessary for Oracle adapter for RETURNING ... INTO ... clause generation
上级 e75f0e5a
......@@ -163,9 +163,17 @@ def to_a # :nodoc:
# FIXME: this method should go away
def insert values
im = InsertManager.new @engine
im.into @ctx.froms
table = @ctx.froms
primary_key_name = (primary_key = table.primary_key) && primary_key.name
# FIXME: in AR tests values sometimes were Array and not Hash therefore is_a?(Hash) check is added
primary_key_value = primary_key && values.is_a?(Hash) && values[primary_key]
im.into table
im.insert values
@engine.connection.insert im.to_sql
# Oracle adapter needs primary key name to generate RETURNING ... INTO ... clause
# for tables which assign primary key value using trigger.
# RETURNING ... INTO ... clause will be added only if primary_key_value is nil
# therefore it is necessary to pass primary key value as well
@engine.connection.insert im.to_sql, 'AREL', primary_key_name, primary_key_value
end
private
......
......@@ -27,7 +27,11 @@ def initialize name, engine = Table.engine
end
def primary_key
@primary_key ||= self[@engine.connection.primary_key(name)]
@primary_key ||= begin
primary_key_name = @engine.connection.primary_key(name)
# some tables might be without primary key
primary_key_name && self[primary_key_name]
end
end
def alias
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册