diff options
-rw-r--r-- | lib/arel/insert_manager.rb | 2 | ||||
-rw-r--r-- | lib/arel/nodes/values.rb | 5 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 4 | ||||
-rw-r--r-- | spec/arel/insert_manager_spec.rb | 5 |
4 files changed, 11 insertions, 5 deletions
diff --git a/lib/arel/insert_manager.rb b/lib/arel/insert_manager.rb index 75e6299def..1759475542 100644 --- a/lib/arel/insert_manager.rb +++ b/lib/arel/insert_manager.rb @@ -27,7 +27,7 @@ module Arel @head.columns << column values << value end - @head.values = Nodes::Values.new values + @head.values = Nodes::Values.new values, @head.columns end end end diff --git a/lib/arel/nodes/values.rb b/lib/arel/nodes/values.rb index eab70a362a..4c7ca76360 100644 --- a/lib/arel/nodes/values.rb +++ b/lib/arel/nodes/values.rb @@ -1,10 +1,11 @@ module Arel module Nodes class Values - attr_accessor :expressions + attr_accessor :expressions, :columns - def initialize exprs + def initialize exprs, columns = [] @expressions = exprs + @columns = columns end end end diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index dc65e86219..46f70d0f7c 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -46,8 +46,8 @@ module Arel end def visit_Arel_Nodes_Values o - "VALUES (#{o.expressions.map { |value| - value.nil? ? 'NULL' : visit(value) + "VALUES (#{o.expressions.zip(o.columns).map { |value, column| + quote(value, column && column.column) }.join ', '})" end diff --git a/spec/arel/insert_manager_spec.rb b/spec/arel/insert_manager_spec.rb index a6d34f4357..1cd61ae630 100644 --- a/spec/arel/insert_manager_spec.rb +++ b/spec/arel/insert_manager_spec.rb @@ -12,6 +12,11 @@ module Arel it "inserts false" do table = Table.new(:users) manager = Arel::InsertManager.new Table.engine + + table[:id].column.extend(Module.new { + def type; :boolean; end + }) + manager.insert [[table[:id], false]] manager.to_sql.should be_like %{ INSERT INTO "users" ("id") VALUES ('f') |