mirror of
https://gitlink.org.cn/Gitlink/forgeplus.git
synced 2026-05-03 03:40:49 +08:00
init project
This commit is contained in:
45
app/libs/custom_sortable.rb
Normal file
45
app/libs/custom_sortable.rb
Normal file
@@ -0,0 +1,45 @@
|
||||
module CustomSortable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do |base|
|
||||
base.instance_variable_set("@_sort_options", {})
|
||||
base.instance_variable_set("@_sort_columns", [])
|
||||
base.instance_variable_set("@_sort_directions", %w(asc desc))
|
||||
end
|
||||
|
||||
def custom_sort(relations, sort_by, sort_direction)
|
||||
sort_by = self.class.sort_options[:default_by] if sort_by.blank?
|
||||
sort_direction = self.class.sort_options[:default_direction] if sort_direction.blank?
|
||||
|
||||
return relations unless self.class.check_sort_parameter_validate(sort_by.to_s, sort_direction.to_s)
|
||||
|
||||
order_method = self.class.sort_options[:reorder] ? :reorder : :order
|
||||
|
||||
default_table = self.class.sort_options[:default_table]
|
||||
if default_table.present?
|
||||
relations.send(order_method, "#{default_table}.#{sort_by} #{sort_direction}")
|
||||
else
|
||||
relations.send(order_method, "#{sort_by} #{sort_direction}")
|
||||
end
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
def sort_columns(*columns)
|
||||
opts = columns.extract_options!
|
||||
@_sort_options[:default_by] = opts[:default_by].to_s
|
||||
@_sort_options[:default_direction] = opts[:default_direction].to_s
|
||||
@_sort_options[:reorder] = opts[:reorder]
|
||||
@_sort_options[:default_table] = opts[:default_table]
|
||||
|
||||
@_sort_columns = columns.map(&:to_s)
|
||||
end
|
||||
|
||||
def check_sort_parameter_validate(sort_by, sort_direction)
|
||||
(sort_by.blank? || @_sort_columns.include?(sort_by)) && @_sort_directions.include?(sort_direction)
|
||||
end
|
||||
|
||||
def sort_options
|
||||
@_sort_options
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user