Skip to content

Commit efbc4f7

Browse files
authored
Merge pull request rails#53526 from kamipo/select_allow_raw_string_value
Fix `select` with a hash not to treat raw strings as identifiers
2 parents a7c8a20 + 9d85e8c commit efbc4f7

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

activerecord/lib/active_record/relation/query_methods.rb

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1959,10 +1959,10 @@ def arel_columns_from_hash(fields)
19591959
table_name = table_name.name if table_name.is_a?(Symbol)
19601960
case columns
19611961
when Symbol, String
1962-
arel_column_with_table(table_name, columns.to_s)
1962+
arel_column_with_table(table_name, columns)
19631963
when Array
19641964
columns.map do |column|
1965-
arel_column_with_table(table_name, column.to_s)
1965+
arel_column_with_table(table_name, column)
19661966
end
19671967
else
19681968
raise TypeError, "Expected Symbol, String or Array, got: #{columns.class}"
@@ -1972,8 +1972,13 @@ def arel_columns_from_hash(fields)
19721972

19731973
def arel_column_with_table(table_name, column_name)
19741974
self.references_values |= [Arel.sql(table_name, retryable: true)]
1975-
predicate_builder.resolve_arel_attribute(table_name, column_name) do
1976-
lookup_table_klass_from_join_dependencies(table_name)
1975+
1976+
if column_name.is_a?(Symbol) || !column_name.match?(/\W/)
1977+
predicate_builder.resolve_arel_attribute(table_name, column_name) do
1978+
lookup_table_klass_from_join_dependencies(table_name)
1979+
end
1980+
else
1981+
Arel.sql("#{model.adapter_class.quote_table_name(table_name)}.#{column_name}")
19771982
end
19781983
end
19791984

@@ -1989,6 +1994,8 @@ def arel_column(field)
19891994
arel_column_with_table(table, column)
19901995
elsif block_given?
19911996
yield field
1997+
elsif Arel.arel_node?(field)
1998+
field
19921999
else
19932000
Arel.sql(is_symbol ? model.adapter_class.quote_table_name(field) : field)
19942001
end
@@ -2225,12 +2232,12 @@ def arel_column_aliases_from_hash(fields)
22252232
case columns_aliases
22262233
when Hash
22272234
columns_aliases.map do |column, column_alias|
2228-
arel_column_with_table(table_name, column.to_s)
2235+
arel_column_with_table(table_name, column)
22292236
.as(model.adapter_class.quote_column_name(column_alias.to_s))
22302237
end
22312238
when Array
22322239
columns_aliases.map do |column|
2233-
arel_column_with_table(table_name, column.to_s)
2240+
arel_column_with_table(table_name, column)
22342241
end
22352242
when String, Symbol
22362243
arel_column(key)

activerecord/test/cases/relation/select_test.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ def test_select_with_invalid_nested_field
102102
end
103103

104104
def test_select_with_hash_argument_without_aliases
105-
post = Post.select(posts: [:title, :id]).take
106-
assert_not_nil post.title
107-
assert_not_nil post.id
105+
post = Post.select(posts: [:title, "title as post_title"]).first
106+
assert_equal "Welcome to the weblog", post.title
107+
assert_equal "Welcome to the weblog", post.post_title
108108
end
109109

110110
def test_select_with_hash_argument_with_few_tables

0 commit comments

Comments
 (0)