module CompositePrimaryKeys::ActiveRecord::Calculations
Public Instance Methods
aggregate_column(column_name)
click to toggle source
# File lib/composite_primary_keys/relation/calculations.rb, line 4 def aggregate_column(column_name) # CPK if column_name.kind_of?(Array) # Note: Test don't seem to run this code? column_name.map do |column| @klass.arel_table[column] end elsif @klass.has_attribute?(column_name) || @klass.attribute_alias?(column_name) @klass.arel_table[column_name] else Arel.sql(column_name == :all ? "*" : column_name.to_s) end end
build_count_subquery(relation, column_name, distinct)
click to toggle source
# File lib/composite_primary_keys/relation/calculations.rb, line 60 def build_count_subquery(relation, column_name, distinct) if column_name == :all column_alias = Arel.star # CPK # relation.select_values = [ Arel.sql(FinderMethods::ONE_AS_ONE) ] unless distinct relation.select_values = [ Arel.sql(::ActiveRecord::FinderMethods::ONE_AS_ONE) ] unless distinct elsif column_name.is_a?(Array) column_alias = Arel.star relation.select_values = column_name.map do |column| Arel::Attribute.new(@klass.unscoped.table, column) end else column_alias = Arel.sql("count_column") relation.select_values = [ aggregate_column(column_name).as(column_alias) ] end subquery_alias = Arel.sql("subquery_for_count") select_value = operation_over_aggregate_column(column_alias, "count", false) relation.build_subquery(subquery_alias, select_value) end
calculate(operation, column_name)
click to toggle source
# File lib/composite_primary_keys/relation/calculations.rb, line 82 def calculate(operation, column_name) if has_include?(column_name) relation = apply_join_dependency if operation.to_s.downcase == "count" unless distinct_value || distinct_select?(column_name || select_for_count) relation.distinct! # CPK # relation.select_values = [ klass.primary_key || table[Arel.star] ] if klass.primary_key.present? && klass.primary_key.is_a?(Array) relation.select_values = klass.primary_key.map do |k| "#{connection.quote_table_name(klass.table_name)}.#{connection.quote_column_name(k)}" end else relation.select_values = [ klass.primary_key || table[Arel.star] ] end end # PostgreSQL: ORDER BY expressions must appear in SELECT list when using DISTINCT relation.order_values = [] if group_values.empty? end relation.calculate(operation, column_name) else perform_calculation(operation, column_name) end end