mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
6160bfbda1
This will allow most consuming code to avoid the deprecation introduced
in 008445d6fd
. The only code which will be
affected is code that is building the `Arel::Table` object manually,
rather than calling `arel_table` on an Active Record class. Hopefully
this case will be rare enough that we don't need to introduce any
additional APIs to work around it.
125 lines
2.5 KiB
Ruby
125 lines
2.5 KiB
Ruby
module Arel
|
|
class Table
|
|
include Arel::Crud
|
|
include Arel::FactoryMethods
|
|
|
|
@engine = nil
|
|
class << self; attr_accessor :engine; end
|
|
|
|
attr_accessor :name, :aliases, :table_alias
|
|
|
|
# TableAlias and Table both have a #table_name which is the name of the underlying table
|
|
alias :table_name :name
|
|
|
|
def initialize(name, as: nil, type_caster: nil)
|
|
@name = name.to_s
|
|
@columns = nil
|
|
@aliases = []
|
|
@type_caster = type_caster
|
|
|
|
# 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?
|
|
if as.to_s == @name
|
|
as = nil
|
|
end
|
|
@table_alias = as
|
|
end
|
|
|
|
def alias name = "#{self.name}_2"
|
|
Nodes::TableAlias.new(self, name).tap do |node|
|
|
@aliases << node
|
|
end
|
|
end
|
|
|
|
def from
|
|
SelectManager.new(self)
|
|
end
|
|
|
|
def join relation, klass = Nodes::InnerJoin
|
|
return from unless relation
|
|
|
|
case relation
|
|
when String, Nodes::SqlLiteral
|
|
raise if relation.empty?
|
|
klass = Nodes::StringJoin
|
|
end
|
|
|
|
from.join(relation, klass)
|
|
end
|
|
|
|
def outer_join relation
|
|
join(relation, Nodes::OuterJoin)
|
|
end
|
|
|
|
def group *columns
|
|
from.group(*columns)
|
|
end
|
|
|
|
def order *expr
|
|
from.order(*expr)
|
|
end
|
|
|
|
def where condition
|
|
from.where condition
|
|
end
|
|
|
|
def project *things
|
|
from.project(*things)
|
|
end
|
|
|
|
def take amount
|
|
from.take amount
|
|
end
|
|
|
|
def skip amount
|
|
from.skip amount
|
|
end
|
|
|
|
def having expr
|
|
from.having expr
|
|
end
|
|
|
|
def [] name
|
|
::Arel::Attribute.new self, name
|
|
end
|
|
|
|
def hash
|
|
# Perf note: aliases and table alias is excluded from the hash
|
|
# aliases can have a loop back to this table breaking hashes in parent
|
|
# relations, for the vast majority of cases @name is unique to a query
|
|
@name.hash
|
|
end
|
|
|
|
def eql? other
|
|
self.class == other.class &&
|
|
self.name == other.name &&
|
|
self.aliases == other.aliases &&
|
|
self.table_alias == other.table_alias
|
|
end
|
|
alias :== :eql?
|
|
|
|
def type_cast_for_database(attribute_name, value)
|
|
type_caster.type_cast_for_database(attribute_name, value)
|
|
end
|
|
|
|
def able_to_type_cast?
|
|
!type_caster.nil?
|
|
end
|
|
|
|
protected
|
|
|
|
attr_reader :type_caster
|
|
|
|
private
|
|
|
|
def attributes_for columns
|
|
return nil unless columns
|
|
|
|
columns.map do |column|
|
|
Attributes.for(column).new self, column.name.to_sym
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|