diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2019-02-13 02:06:06 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2019-02-13 02:47:46 +0900 |
commit | 0ee96d13de29680e148ccb8e5b68025f29fd091c (patch) | |
tree | e8e2095bc74f34b8a0447cace738368e8ff79bef /activerecord/lib/active_record/relation/query_methods.rb | |
parent | ed9acb4fcc793ce1ab68a0e5076dc9458cc7f218 (diff) | |
download | rails-0ee96d13de29680e148ccb8e5b68025f29fd091c.tar.gz rails-0ee96d13de29680e148ccb8e5b68025f29fd091c.tar.bz2 rails-0ee96d13de29680e148ccb8e5b68025f29fd091c.zip |
Fix `pluck` and `select` with custom attributes
Currently custom attributes are always qualified by the table name in
the generated SQL wrongly even if the table doesn't have the named
column, it would cause an invalid SQL error.
Custom attributes should only be qualified if the table has the same
named column.
Diffstat (limited to 'activerecord/lib/active_record/relation/query_methods.rb')
-rw-r--r-- | activerecord/lib/active_record/relation/query_methods.rb | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb index eb80aab701..75976aa8fc 100644 --- a/activerecord/lib/active_record/relation/query_methods.rb +++ b/activerecord/lib/active_record/relation/query_methods.rb @@ -1052,11 +1052,13 @@ module ActiveRecord def arel_columns(columns) columns.flat_map do |field| - if (Symbol === field || String === field) && (klass.has_attribute?(field) || klass.attribute_alias?(field)) && !from_clause.value - arel_attribute(field) - elsif Symbol === field - connection.quote_table_name(field.to_s) - elsif Proc === field + case field + when Symbol + field = field.to_s + arel_column(field) { connection.quote_table_name(field) } + when String + arel_column(field) { field } + when Proc field.call else field @@ -1064,6 +1066,16 @@ module ActiveRecord end end + def arel_column(field) + field = klass.attribute_alias(field) if klass.attribute_alias?(field) + + if klass.columns_hash.key?(field) && !from_clause.value + arel_attribute(field) + else + yield + end + end + def reverse_sql_order(order_query) if order_query.empty? return [arel_attribute(primary_key).desc] if primary_key |