Skip to content

Instantly share code, notes, and snippets.

@alehmann
Last active April 18, 2018 03:31
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save alehmann/02908a12866e4a193dde to your computer and use it in GitHub Desktop.
Save alehmann/02908a12866e4a193dde to your computer and use it in GitHub Desktop.
Overriden ransack evaluate method in context.rb to support simple custom sort scopes
# A custom initializer that enables sorting via custom scopes in Ransack (like the same feature in MetaSearch)
module Ransack
module Adapters
module ActiveRecord
class Context < ::Ransack::Context
# Allows for sorting by custom scopes
#
#
# Define your custom scopes in your model, e. g. sort_by_title_asc and sort_by_title_desc
# (The scopes would sort by some calculated column or a column added via some crazy join, etc.)
#
# In your sort links refer to the scopes like to standard fields, e. g.
# <%= sort_link(@q, :title, 'Crazy calculated title') %>
def evaluate(search, opts = {})
viz = Visitor.new
relation = @object.where(viz.accept(search.base))
if search.sorts.any?
custom_scopes = search.sorts.select do |s|
custom_scope_name = :"sort_by_#{s.name}_#{s.dir}"
relation.respond_to?(custom_scope_name)
end
attribute_scopes = search.sorts - custom_scopes
relation = relation.except(:order)
custom_scopes.each do |s|
custom_scope_name = :"sort_by_#{s.name}_#{s.dir}"
relation = relation.public_send(custom_scope_name)
end
relation = relation.reorder(viz.accept(attribute_scopes)) if attribute_scopes.any?
end
opts[:distinct] ? relation.distinct : relation
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment