NameL3ss

Untitled

Jul 9th, 2020
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.59 KB | None | 0 0
  1. # whitout pattern
  2. module CustomSortBy
  3. include ActiveSupport::Concern
  4.  
  5. def custom_sort_by(model, sort_direction, preferent)
  6. return all unless model.present?
  7.  
  8. case model
  9. when TruckDriver.name.underscore
  10. merge(TruckDriver.sort_by_name(sort_direction))
  11. when CustomField.name.underscore
  12. merge(CustomField.sort_by_value_same_type(preferent, sort_direction))
  13. when Address.name.underscore
  14. merge(Address.sort_by_name(sort_direction))
  15. when GuideItem.name.underscore
  16. merge(GuideItem.sort_by_total_quantity(sort_direction))
  17. when Contact.name.underscore
  18. merge(Contact.sort_by_name(sort_direction))
  19. when Dispatch.name.underscore
  20. order(status_id: sort_direction)
  21. when 'guide'
  22. merge(DispatchGuide.sort_by_max_delivery_time(sort_direction))
  23. else
  24. merge(DispatchGuide.sort_by_max_delivery_time(:desc))
  25. end
  26. end
  27.  
  28. def can_search?(params)
  29. permit = JSON.parse(params).keys.each{ |k| permitted_searches[k] }
  30. permit.exclude?(false)
  31. end
  32. end
  33.  
  34. # with pattern
  35.  
  36. module CustomSortBy
  37. include ActiveSupport::Concern
  38.  
  39. def custom_sort_by(model, sort_direction, preferent)
  40. return all unless model.present?
  41.  
  42. models = %w[truck_driver custom_field address guide_item contact dispatch guide]
  43. if models.include? model
  44. chain_of_responsability = GenericSortDirectionHandler.new(
  45. CustomFieldHandler.new(
  46. GuideItemHandler.new(
  47. DispatchHandler.new(
  48. GuideHandler.new
  49. )
  50. )
  51. )
  52. )
  53. merge(chain_of_responsability.process_sort(model, sort_direction, preferent))
  54. else
  55. merge(DispatchGuide.sort_by_max_delivery_time(:desc))
  56. end
  57. end
  58.  
  59. def can_search?(params)
  60. permit = JSON.parse(params).keys.each{ |k| permitted_searches[k] }
  61. permit.exclude?(false)
  62. end
  63. end
  64.  
  65. class BaseChain
  66. GENERIC_MODELS = %w[truck_driver address contact].freeze
  67. HANDLER_NAME = 'EntityHandler'
  68.  
  69. attr_reader :successor
  70.  
  71. def initialize(successor = nil)
  72. @successor = successor
  73. end
  74.  
  75. def parse_model_name(model)
  76. model.classify.constantize
  77. end
  78.  
  79. def process_sort(model, sort_direction, preferent)
  80. res = match_handler(model)
  81. if res.present?
  82. custom_sort_by(model, sort_direction, preferent)
  83. elsif @successor
  84. @successor.process_sort(model, sort_direction, preferent)
  85. else
  86. not_matches(model)
  87. end
  88. end
  89.  
  90. def custom_sort_by(*)
  91. raise 'method must be implemented.'
  92. end
  93.  
  94. def match_handler(model)
  95. handler_name = HANDLER_NAME.gsub('Entity', model.classify)
  96. handler_name == self.class.name || model.in?(GENERIC_MODELS)
  97. end
  98.  
  99. def not_matches(model)
  100. raise "not matches #{model}"
  101. end
  102. end
  103.  
  104. class GenericSortDirectionHandler < BaseChain
  105. def custom_sort_by(model, sort_direction, _preferent)
  106. parse_model_name(model).sort_by_name(sort_direction)
  107. end
  108. end
  109.  
  110. class GuideItemHandler < BaseChain
  111. def custom_sort_by(model, sort_direction, _preferent)
  112. parse_model_name(model).sort_by_total_quantity(sort_direction)
  113. end
  114. end
  115.  
  116. class CustomFieldHandler < BaseChain
  117. def custom_sort_by(model, sort_direction, preferent)
  118. parse_model_name(model).sort_by_value_same_type(preferent, sort_direction)
  119. end
  120. end
  121.  
  122. class DispatchHandler < BaseChain
  123. def custom_sort_by(model, sort_direction, _preferent)
  124. parse_model_name(model).order(status_id: sort_direction)
  125. end
  126. end
  127.  
  128. class GuideHandler < BaseChain
  129. def custom_sort_by(_model, sort_direction, _preferent)
  130. DispatchGuide.sort_by_max_delivery_time(sort_direction)
  131. end
  132. end
Advertisement
Add Comment
Please, Sign In to add comment