From 71803320501604f19dc3312ebcf1bab91d9c5f4c Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 13 Aug 2010 15:43:32 -0700 Subject: inserts are starting to take shape --- lib/arel/insert_manager.rb | 3 +++ lib/arel/visitors/to_sql.rb | 11 ++++++++++- spec/arel/insert_manager.rb | 43 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/lib/arel/insert_manager.rb b/lib/arel/insert_manager.rb index bfd3034df4..d6c663a9c4 100644 --- a/lib/arel/insert_manager.rb +++ b/lib/arel/insert_manager.rb @@ -9,5 +9,8 @@ module Arel @head.relation = table self end + + def columns; @head.columns end + def values; @head.values end end end diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index 7a97b0d445..74b7dd9385 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -13,7 +13,11 @@ module Arel private def visit_Arel_Nodes_InsertStatement o - "INSERT INTO #{visit o.relation}" + [ + "INSERT INTO #{visit o.relation}", + ("(#{o.columns.map { |x| visit x }.join ', '})" unless o.columns.empty?), + ("VALUES (#{o.values.map { |x| quote visit x }.join ', '})" unless o.values.empty?), + ].compact.join ' ' end def visit_Arel_Nodes_SelectStatement o @@ -42,6 +46,7 @@ module Arel def visit_Arel_Attributes_Integer o "#{quote_table_name o.relation.name}.#{quote_column_name o.name}" end + alias :visit_Arel_Attributes_String :visit_Arel_Attributes_Integer def visit_Fixnum o; o end alias :visit_String :visit_Fixnum @@ -61,6 +66,10 @@ module Arel DISPATCH[const] = method end + def quote value, column = nil + @connection.quote value, column + end + def quote_table_name name @connection.quote_table_name name end diff --git a/spec/arel/insert_manager.rb b/spec/arel/insert_manager.rb index 8d49556fa9..fae776a39d 100644 --- a/spec/arel/insert_manager.rb +++ b/spec/arel/insert_manager.rb @@ -13,9 +13,7 @@ module Arel manager = Arel::InsertManager.new Table.engine manager.into(Table.new(:users)).should == manager end - end - describe 'to_sql' do it 'converts to sql' do table = Table.new :users manager = Arel::InsertManager.new Table.engine @@ -25,5 +23,46 @@ module Arel } end end + + describe 'columns' do + it "converts to sql" do + table = Table.new :users + manager = Arel::InsertManager.new Table.engine + manager.into table + manager.columns << table[:id] + manager.to_sql.should be_like %{ + INSERT INTO "users" ("users"."id") + } + end + end + + describe "values" do + it "converts to sql" do + table = Table.new :users + manager = Arel::InsertManager.new Table.engine + manager.into table + + manager.values << 1 + manager.to_sql.should be_like %{ + INSERT INTO "users" VALUES (1) + } + end + end + + describe "combo" do + it "puts shit together" do + table = Table.new :users + manager = Arel::InsertManager.new Table.engine + manager.into table + + manager.values << 1 + manager.values << "aaron" + manager.columns << table[:id] + manager.columns << table[:name] + manager.to_sql.should be_like %{ + INSERT INTO "users" ("users"."id", "users"."name") VALUES (1, 'aaron') + } + end + end end end -- cgit v1.2.3