1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Arel doesn't has to know if a table or column exists.

This commit is contained in:
Emilio Tagua 2010-03-10 18:16:07 -03:00
parent c03d4bb8e4
commit b706f690b6
5 changed files with 39 additions and 9 deletions

View file

@ -84,7 +84,8 @@ module Arel
module AttributeAccessable
def [](index)
case index
@cached_attributes ||= {}
@cached_attributes[index] ||= case index
when Symbol, String
find_attribute_matching_name(index)
when Attribute, Expression
@ -96,7 +97,7 @@ module Arel
end
def find_attribute_matching_name(name)
attributes.detect { |a| a.named?(name) }
attributes.detect { |a| a.named?(name) } || Attribute.new(self, name)
end
def find_attribute_matching_attribute(attribute)

View file

@ -2,7 +2,7 @@ module Arel
class Table < Relation
include Recursion::BaseCase
cattr_accessor :engine
cattr_accessor :engine, :tables
attr_reader :name, :engine, :table_alias, :options
def initialize(name, options = {})
@ -19,6 +19,7 @@ module Arel
if @engine.connection
begin
require "arel/engines/sql/compilers/#{@engine.adapter_name.downcase}_compiler"
@@tables ||= engine.tables
rescue LoadError
raise "#{@engine.adapter_name} is not supported by Arel."
end
@ -29,9 +30,20 @@ module Arel
Table.new(name, options.merge(:as => table_alias))
end
def table_exists?
if @table_exists
true
else
@table_exists = @@tables.include?(name) || engine.table_exists?(name)
end
end
def attributes
@attributes ||= columns.collect do |column|
Attribute.new(self, column.name.to_sym)
return @attributes if defined?(@attributes)
if table_exists?
@attributes = columns.collect { |column| Attribute.new(self, column.name.to_sym) }
else
[]
end
end

View file

@ -16,10 +16,9 @@ module Arel
end
describe 'when given a', Symbol, String do
it "returns the attribute with the same name, if it exists" do
it "returns the attribute with the same name" do
check @relation[:id].should == @attribute1
check @relation['id'].should == @attribute1
@relation[:does_not_exist].should be_nil
end
end
end

View file

@ -10,7 +10,6 @@ module Arel
describe 'when given a', Symbol do
it "manufactures an attribute if the symbol names an attribute within the relation" do
check @relation[:id].should == Attribute.new(@relation, :id)
@relation[:does_not_exist].should be_nil
end
end

View file

@ -9,7 +9,7 @@ module Arel
describe '#column' do
it "returns the corresponding column in the relation" do
@attribute.column.should == @relation.column_for(@attribute)
@attribute.column.should == @relation.column_for(@attribute)
end
end
@ -31,6 +31,25 @@ module Arel
end
end
end
describe 'for an inexistent attribute' do
it "manufactures sql" do
sql = @relation[:does_not_exist].to_sql
adapter_is :mysql do
sql.should be_like(%Q{`users`.`does_not_exist`})
end
adapter_is :oracle do
sql.should be_like(%Q{"USERS"."DOEST_NOT_EXIST"})
end
adapter_is_not :mysql, :oracle do
sql.should be_like(%Q{"users"."does_not_exist"})
end
end
end
end
end
end