Sha256: d5013a91689debb41316400d131d05f29f7dd14b91374db71566dff5eef796ae

Contents?: true

Size: 1.02 KB

Versions: 1

Compression:

Stored size: 1.02 KB

Contents

class ActiveRecordQueryFixer
  attr_reader :query

  def self.fix(query)
    new(query: query).fix.query
  end

  def initialize(args)
    @query = args.fetch(:query)
  end

  def fix
    fix_order_group
    fix_order_select_distinct
    self
  end

  def fix_order_group
    return if @query.values[:group].empty?

    changed = false
    @query.values[:order].each do |order|
      next if !order.is_a?(Arel::Nodes::Ascending) &&
          !order.is_a?(Arel::Nodes::Descending)

      @query = @query.group("#{order.expr.relation.right}.#{order.expr.name}")
      changed = true
    end

    self
  end

  def fix_order_select_distinct
    return unless @query.values[:distinct]

    changed = false
    @query.values[:order].each do |order|
      next if !order.is_a?(Arel::Nodes::Ascending) &&
          !order.is_a?(Arel::Nodes::Descending)

      @query = @query.select("#{order.expr.relation.right}.#{order.expr.name}")
      changed = true
    end

    @query = @query.select("#{@query.table_name}.*") if changed
    self
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
active_record_query_fixer-0.0.0 lib/active_record_query_fixer.rb