Sha256: 8f2fa8300c728f4c675e6eae296f9d3e2520593c4b8a99304936364f7fc1b01c

Contents?: true

Size: 1.68 KB

Versions: 8

Compression:

Stored size: 1.68 KB

Contents

module FortyFacets
  # Represents the ordering for a specific search
  Order = Struct.new(:search, :definition, :active) do
    def title
      definition.title
    end

    # Returns a search with the same filter ordered by this criteria
    def by
      new_params = search.params || {}
      new_params[:order] = definition.request_value
      search.class.new_unwrapped(new_params, search.root)
    end

    def apply(query)
      if [Symbol, String, Hash].include? definition.clause.class
        query.order(definition.clause)
      elsif definition.clause.is_a? Array # [:person, :first_name]
        # new and unelegant handling of ordering by columns from joined tables
        root_table = search.class.root_class.table_name
        primary_key = search.class.root_class.primary_key
        just_ids = query.select("#{root_table}.#{primary_key}")
        path_to_order_property = definition.clause
        order_class = path_to_order_property
                      .take(path_to_order_property.length - 1)
                      .inject(search.class.root_class) do |prev_class, assoc_name|
                        prev_class.reflect_on_association(assoc_name).klass
                      end
        joins = path_to_order_property
                  .reverse
                  .drop(1)
                  .inject(nil) do |sum, elem|
                    if sum
                      {elem => sum}
                    else
                      elem
                    end
                  end
        search.root
          .joins(joins)
          .where(search.class.root_class.primary_key => just_ids)
          .order("#{order_class.table_name}.#{path_to_order_property.last}")
      end

    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
forty_facets-0.2.1 lib/forty_facets/order.rb
forty_facets-0.2 lib/forty_facets/order.rb
forty_facets-0.1.9.1 lib/forty_facets/order.rb
forty_facets-0.1.9.0 lib/forty_facets/order.rb
forty_facets-0.1.8.9 lib/forty_facets/order.rb
forty_facets-0.1.8 lib/forty_facets/order.rb
forty_facets-0.1.7 lib/forty_facets/order.rb
forty_facets-0.1.6 lib/forty_facets/order.rb