Skip to content

Commit 524fed6

Browse files
committed
Support function table names in Arel Table
Make it possible to select from computed/function table using Arel, or pass arbitrary string as a table name This makes it possible to use Arel to query against functions, e.g., generate_series in PostgreSQL, or json_each, or whatever
1 parent 218ec10 commit 524fed6

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

activerecord/lib/arel/table.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,14 @@ class << self; attr_accessor :engine; end
1414
alias :table_name :name
1515

1616
def initialize(name, as: nil, klass: nil, type_caster: klass&.type_caster)
17-
@name = name.to_s
17+
@name =
18+
case name
19+
when Symbol then name.to_s
20+
when Nodes::Node then Arel.sql(name.to_sql)
21+
else
22+
name
23+
end
24+
1825
@klass = klass
1926
@type_caster = type_caster
2027

activerecord/test/cases/arel/table_test.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,19 @@ class TableTest < Arel::Spec
127127
rel = Table.new :users, as: "users"
128128
_(rel.table_alias).must_be_nil
129129
end
130+
131+
it "should accept literal SQL" do
132+
rel = Table.new Arel.sql("generate_series(4, 2)")
133+
manager = rel.project(Arel.star)
134+
_(manager.to_sql).must_be_like %{ SELECT * FROM generate_series(4, 2) }
135+
end
136+
137+
it "should accept Arel nodes" do
138+
node = Arel::Nodes::NamedFunction.new("generate_series", [4, 2])
139+
rel = Table.new node
140+
manager = rel.project(Arel.star)
141+
_(manager.to_sql).must_be_like %{ SELECT * FROM generate_series(4, 2) }
142+
end
130143
end
131144

132145
describe "order" do

0 commit comments

Comments
 (0)