Guest User

Untitled

a guest
May 23rd, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.18 KB | None | 0 0
  1. #
  2. # The Scope class allows you to easily stack more than one scope on top
  3. # of a ActiveRecord::Base class.
  4. class Scope
  5.  
  6. def initialize(klass, scope=nil)
  7. @klass = klass
  8. @scopes = []
  9. @joins = []
  10. add(scope) if scope
  11. end
  12.  
  13. def joins(s); add(:joins => s); end
  14. def conditions(s); add(:conditions => s); end
  15. def include(s); add(:include => s); end
  16.  
  17. def find(*opts)
  18. exec(0) { @klass.find *prepare_find_options(*opts) }
  19. end
  20.  
  21. def count(*opts)
  22. exec(0) { @klass.count *prepare_find_options(*opts) }
  23. end
  24.  
  25. private
  26.  
  27. def add(scope)
  28. scope = scope.dup
  29. if joins = scope[:joins]
  30. @joins << scope.delete(:joins)
  31. end
  32. @scopes << { :find => scope }
  33.  
  34. self
  35. end
  36.  
  37. def exec(i)
  38. if i == @scopes.length
  39. yield
  40. else
  41. @klass.with_scope(@scopes[i]) do
  42. exec(i+1) { yield }
  43. end
  44. end
  45. end
  46.  
  47. def prepare_find_options(*opts)
  48. hash = opts.last.is_a?(Hash) ? opts.pop.dup : {}
  49.  
  50. joins = ([ hash.delete(:joins) ] + @joins).compact
  51.  
  52. hash.update(:joins => joins.join(" ")) unless joins.empty?
  53.  
  54. opts.push hash
  55. opts
  56. end
  57. end
Add Comment
Please, Sign In to add comment