diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2010-08-12 15:40:58 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2010-08-12 15:40:58 -0700 |
commit | d827d6e9ee10fa0906b7b3cfd191e6f9ac5d6b08 (patch) | |
tree | 7ed24e39bc417a0ba6c2f344cc6b616c35c2a8e0 /lib/arel | |
parent | 199d17b2dbb56000098a0372f0c64ce0aa3711ce (diff) | |
download | rails-d827d6e9ee10fa0906b7b3cfd191e6f9ac5d6b08.tar.gz rails-d827d6e9ee10fa0906b7b3cfd191e6f9ac5d6b08.tar.bz2 rails-d827d6e9ee10fa0906b7b3cfd191e6f9ac5d6b08.zip |
to_sql visitor started
Diffstat (limited to 'lib/arel')
-rw-r--r-- | lib/arel/nodes/equality.rb | 5 | ||||
-rw-r--r-- | lib/arel/table.rb | 2 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 38 |
3 files changed, 45 insertions, 0 deletions
diff --git a/lib/arel/nodes/equality.rb b/lib/arel/nodes/equality.rb index 11383b1d89..d778380054 100644 --- a/lib/arel/nodes/equality.rb +++ b/lib/arel/nodes/equality.rb @@ -7,6 +7,11 @@ module Arel @left = left @right = right end + + def to_sql + viz = Visitors::ToSql.new left.relation.engine + viz.accept self + end end end end diff --git a/lib/arel/table.rb b/lib/arel/table.rb index 78b3ea9933..0ab39f134d 100644 --- a/lib/arel/table.rb +++ b/lib/arel/table.rb @@ -3,6 +3,8 @@ module Arel @engine = nil class << self; attr_accessor :engine; end + attr_reader :name, :engine + def initialize name, engine = Table.engine @name = name @engine = engine diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb new file mode 100644 index 0000000000..ba92ca7ef1 --- /dev/null +++ b/lib/arel/visitors/to_sql.rb @@ -0,0 +1,38 @@ +module Arel + module Visitors + class ToSql + def initialize engine + @engine = engine + @connection = nil + end + + def accept object + @connection = @engine.connection + visit object + end + + private + def visit_Arel_Nodes_Equality o + "#{visit o.left} = #{visit o.right}" + end + + def visit_Arel_Attributes_Integer o + "#{quote_table_name o.relation.name}.#{quote_column_name o.name}" + end + + def visit_Fixnum o; o end + + def visit object + send :"visit_#{object.class.name.gsub('::', '_')}", object + end + + def quote_table_name name + @connection.quote_table_name name + end + + def quote_column_name name + @connection.quote_column_name name + end + end + end +end |