class ActiveRecord::Relation

Public Instance Methods

calculated(*args) click to toggle source
# File lib/calculated_attributes/model_methods.rb, line 71
def calculated(*args)
  projections = arel.projections
  args = args.flat_map do |arg|
    case arg
    when Symbol then [[arg, []]]
    when Hash then arg.to_a
    end
  end

  args.each do |attribute, arguments|
    lam = klass.calculated.calculated[attribute] || klass.base_class.calculated.calculated[attribute]
    sql = lam.call(*arguments)
    sql = klass.send(:sanitize_sql, *sql) if sql.is_a?(Array)
    new_projection =
      if sql.is_a?(String)
        Arel.sql("(#{sql})").as(attribute.to_s)
      elsif sql.respond_to? :to_sql
        Arel.sql("(#{sql.to_sql})").as(attribute.to_s)
      else
        sql.as(attribute.to_s)
      end
    new_projection.calculated_attr!
    projections.push new_projection
  end
  select(projections)
end