diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2010-08-13 15:43:32 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2010-08-13 15:43:32 -0700 |
commit | 71803320501604f19dc3312ebcf1bab91d9c5f4c (patch) | |
tree | eaec4fa7d536358bfc84dd0c20b76ea71a18c7fa | |
parent | b1e7bd7d026c888d4c406adc595577b7ebc84ed5 (diff) | |
download | rails-71803320501604f19dc3312ebcf1bab91d9c5f4c.tar.gz rails-71803320501604f19dc3312ebcf1bab91d9c5f4c.tar.bz2 rails-71803320501604f19dc3312ebcf1bab91d9c5f4c.zip |
inserts are starting to take shape
-rw-r--r-- | lib/arel/insert_manager.rb | 3 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 11 | ||||
-rw-r--r-- | 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 |