Sha256: 686cbe10e617cdfdf7a63380ff72a229e00be222d6a96335336987bfe0e9952a
Contents?: true
Size: 1.52 KB
Versions: 4
Compression:
Stored size: 1.52 KB
Contents
module DataTables module Modules class Order attr_reader :scope, :context def initialize(model, scope, params) @scope = scope.dup @model = model @params = params end def order columns = orderable_columns(@params[:order], @params[:columns]) orders = DataTables::Responder.flat_keys_to_nested columns order_by, join_hash = build_order(@model, orders) @scope = @scope.joins(join_hash) order_by.inject(@scope) { |r, o| r.order(o) } end def build_order(model, in_hash, join_hash = nil) # Tuple! return in_hash.inject([]) { |sum, (k, h)| case h when Hash if (klass = model.reflect_on_association(k).try(:klass)) new_sum, join_class = build_order(klass, h) join_hash = join_class.nil? ? [k] : {k => join_class} sum += new_sum else warn("trying to reflect on #{k} but #{model.class.name} has no such association.") end else sum << model.arel_table[k].send(h) if model.column_names.include?(k.to_s) end sum }, join_hash end protected def orderable_columns(orders, columns) orders&.inject({}) do |collection, order| column = columns[order[:column]] if (column[:orderable] && column[:data].present?) collection[column[:data]] = order[:dir] end collection end end end end end
Version data entries
4 entries across 4 versions & 1 rubygems