pushing id insertion and prefetch primary keys down to Relation#insert

This commit is contained in:
Aaron Patterson 2011-03-22 09:18:01 -07:00
parent 3378d77b04
commit 15d3cc21f4
4 changed files with 23 additions and 12 deletions

@ -272,6 +272,10 @@ def insert_fixture(fixture, table_name)
execute "INSERT INTO #{quote_table_name(table_name)} (#{key_list.join(', ')}) VALUES (#{value_list.join(', ')})", 'Fixture Insert'
end
def null_insert_value
Arel.sql 'DEFAULT'
end
def empty_insert_statement_value
"VALUES(DEFAULT)"
end

@ -336,6 +336,10 @@ def rename_column(table_name, column_name, new_column_name) #:nodoc:
alter_table(table_name, :rename => {column_name.to_s => new_column_name.to_s})
end
def null_insert_value
Arel.sql 'NULL'
end
def empty_insert_statement_value
"VALUES(NULL)"
end

@ -270,17 +270,9 @@ def update(attribute_names = @attributes.keys)
# Creates a record with values matching those of the instance attributes
# and returns its id.
def create
if id.nil? && connection.prefetch_primary_key?(self.class.table_name)
self.id = connection.next_sequence_value(self.class.sequence_name)
end
attributes_values = arel_attributes_values(!id.nil?)
new_id = if attributes_values.empty?
self.class.unscoped.insert connection.empty_insert_statement_value
else
self.class.unscoped.insert attributes_values
end
new_id = self.class.unscoped.insert attributes_values
self.id ||= new_id

@ -30,15 +30,26 @@ def initialize(klass, table)
end
def insert(values)
im = arel.compile_insert values
im.into @table
primary_key_value = nil
if primary_key && Hash === values
primary_key_value = values[values.keys.find { |k|
k.name == primary_key
}]
if !primary_key_value && connection.prefetch_primary_key?(klass.table_name)
primary_key_value = connection.next_sequence_value(klass.sequence_name)
values[klass.arel_table[klass.primary_key]] = primary_key_value
end
end
im = arel.create_insert
im.into @table
if values.empty? # empty insert
im.values = im.create_values [connection.null_insert_value], []
else
im.insert values
end
@klass.connection.insert(