From dd425e1258b8480aa8e28e52edea7ef4c9c6f55f Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 21 Sep 2010 13:50:53 -0700 Subject: constructor can take column info --- lib/arel/table.rb | 27 +++++++++++++++++++-------- spec/arel/table_spec.rb | 7 +++++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/lib/arel/table.rb b/lib/arel/table.rb index d23245691b..a1243f582b 100644 --- a/lib/arel/table.rb +++ b/lib/arel/table.rb @@ -10,16 +10,20 @@ module Arel def initialize name, engine = Table.engine @name = name @engine = engine - @engine = engine[:engine] if Hash === engine @columns = nil @aliases = [] @table_alias = nil @primary_key = nil - # Sometime AR sends an :as parameter to table, to let the table know that - # it is an Alias. We may want to override new, and return a TableAlias - # node? - @table_alias = engine[:as] if Hash === engine + if Hash === engine + @engine = engine[:engine] || Table.engine + @columns = attributes_for engine[:columns] + + # Sometime AR sends an :as parameter to table, to let the table know + # that it is an Alias. We may want to override new, and return a + # TableAlias node? + @table_alias = engine[:as] + end end def primary_key @@ -82,9 +86,8 @@ module Arel end def columns - @columns ||= @engine.connection.columns(@name, "#{@name} Columns").map do |column| - Attributes.for(column).new self, column.name.to_sym, column - end + @columns ||= + attributes_for @engine.connection.columns(@name, "#{@name} Columns") end def [] name @@ -95,6 +98,14 @@ module Arel end private + def attributes_for columns + return nil unless columns + + columns.map do |column| + Attributes.for(column).new self, column.name.to_sym, column + end + end + def table_exists? @table_exists ||= tables.key?(@name) || engine.connection.table_exists?(name) end diff --git a/spec/arel/table_spec.rb b/spec/arel/table_spec.rb index 28fc95dec5..5c8cfac012 100644 --- a/spec/arel/table_spec.rb +++ b/spec/arel/table_spec.rb @@ -71,6 +71,13 @@ module Arel end describe 'new' do + it 'takes :columns' do + columns = Table.engine.connection.columns("users") + @relation = Table.new(:users, :columns => columns) + check @relation.columns.first.name.should == :id + check @relation.engine.should == Table.engine + end + it 'should accept an engine' do rel = Table.new :users, 'foo' check rel.engine.should == 'foo' -- cgit v1.2.3