active_manageable 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/Gemfile.lock +55 -55
- data/README.md +82 -12
- data/lib/active_manageable/authorization/cancancan.rb +10 -12
- data/lib/active_manageable/authorization/pundit.rb +10 -12
- data/lib/active_manageable/base.rb +14 -3
- data/lib/active_manageable/configuration.rb +16 -7
- data/lib/active_manageable/methods/auxiliary/includes.rb +28 -30
- data/lib/active_manageable/methods/auxiliary/model_attributes.rb +15 -17
- data/lib/active_manageable/methods/auxiliary/order.rb +12 -14
- data/lib/active_manageable/methods/auxiliary/scopes.rb +35 -28
- data/lib/active_manageable/methods/auxiliary/select.rb +11 -13
- data/lib/active_manageable/methods/auxiliary/unique_search.rb +19 -19
- data/lib/active_manageable/methods/create.rb +20 -5
- data/lib/active_manageable/methods/destroy.rb +22 -7
- data/lib/active_manageable/methods/edit.rb +17 -9
- data/lib/active_manageable/methods/index.rb +28 -26
- data/lib/active_manageable/methods/new.rb +14 -6
- data/lib/active_manageable/methods/show.rb +17 -9
- data/lib/active_manageable/methods/update.rb +28 -7
- data/lib/active_manageable/pagination/kaminari.rb +29 -9
- data/lib/active_manageable/search/ransack.rb +15 -17
- data/lib/active_manageable/version.rb +1 -1
- metadata +2 -2
@@ -33,7 +33,7 @@ module ActiveManageable
|
|
33
33
|
# the associations and options we cannot use the array extract_options! method
|
34
34
|
# as this removes the last element in the array if it's a hash.
|
35
35
|
#
|
36
|
-
# For example
|
36
|
+
# For example:-
|
37
37
|
# default_includes songs: :artist, loading_method: :preload, methods: :index
|
38
38
|
# results in an argument value of :-
|
39
39
|
# [{:songs=>:artist, :loading_method=>:preload, :methods=>:index}]
|
@@ -58,38 +58,36 @@ module ActiveManageable
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
|
62
|
-
|
61
|
+
def default_includes(method: @current_method)
|
62
|
+
includes = defaults[:includes] || {}
|
63
|
+
associations = includes.dig(method.try(:to_sym), :associations) || includes.dig(:all, :associations)
|
64
|
+
associations.is_a?(Proc) ? instance_exec(&associations) : associations
|
65
|
+
end
|
63
66
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
# or configuration default loading_method.
|
70
|
-
def includes(opts)
|
71
|
-
unless opts.is_a?(Hash) && opts.key?(:associations)
|
72
|
-
opts = {associations: opts}
|
73
|
-
end
|
74
|
-
associations = opts[:associations] || get_default_includes_associations
|
75
|
-
if associations.present?
|
76
|
-
loading_method = opts[:loading_method] || get_default_includes_loading_method
|
77
|
-
@target = @target.send(loading_method, associations)
|
78
|
-
else
|
79
|
-
@target
|
80
|
-
end
|
81
|
-
end
|
67
|
+
def default_loading_method(method: @current_method)
|
68
|
+
includes = defaults[:includes] || {}
|
69
|
+
loading_method = includes.dig(method.try(:to_sym), :loading_method) || includes.dig(:all, :loading_method)
|
70
|
+
loading_method || ActiveManageable.configuration.default_loading_method
|
71
|
+
end
|
82
72
|
|
83
|
-
|
84
|
-
includes = defaults[:includes] || {}
|
85
|
-
associations = includes.dig(@current_method, :associations) || includes.dig(:all, :associations)
|
86
|
-
associations.is_a?(Proc) ? instance_exec(&associations) : associations
|
87
|
-
end
|
73
|
+
private
|
88
74
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
75
|
+
# Accepts either an array/hash of associations
|
76
|
+
# or a hash with associations and loading_method keys
|
77
|
+
# so it's possible to specify loading_method on a per request basis.
|
78
|
+
# Uses associations and loading_method from opts
|
79
|
+
# or defaults for the method or defaults for all methods
|
80
|
+
# or configuration default loading_method.
|
81
|
+
def includes(opts)
|
82
|
+
unless opts.is_a?(Hash) && opts.key?(:associations)
|
83
|
+
opts = {associations: opts}
|
84
|
+
end
|
85
|
+
associations = opts[:associations] || default_includes
|
86
|
+
if associations.present?
|
87
|
+
loading_method = opts[:loading_method] || default_loading_method
|
88
|
+
@target = @target.send(loading_method, associations)
|
89
|
+
else
|
90
|
+
@target
|
93
91
|
end
|
94
92
|
end
|
95
93
|
end
|
@@ -33,25 +33,23 @@ module ActiveManageable
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
|
-
|
36
|
+
# Returns the default attribute values for the method
|
37
|
+
# from the class attribute that can contain a hash of attribute values
|
38
|
+
# or a lambda/proc to execute to return attribute values
|
39
|
+
def default_attribute_values(method: @current_method)
|
40
|
+
default_attributes = defaults[:attributes] || {}
|
41
|
+
attributes = default_attributes[method.try(:to_sym)] || default_attributes[:all] || {}
|
42
|
+
attributes = (instance_exec(&attributes) || {}) if attributes.is_a?(Proc)
|
43
|
+
attributes.with_indifferent_access
|
44
|
+
end
|
38
45
|
|
39
|
-
|
40
|
-
# consisting of a merge of the method attributes argument
|
41
|
-
# and class defaults with the method argument taking precedence
|
42
|
-
def attribute_values
|
43
|
-
@attributes.is_a?(Hash) ? @attributes.reverse_merge(get_default_attribute_values) : @attributes
|
44
|
-
end
|
46
|
+
private
|
45
47
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
attributes = default_attributes[@current_method] || default_attributes[:all] || {}
|
52
|
-
attributes = (instance_exec(&attributes) || {}) if attributes.is_a?(Proc)
|
53
|
-
attributes.with_indifferent_access
|
54
|
-
end
|
48
|
+
# Returns attribute values to use in the new and create methods
|
49
|
+
# consisting of a merge of the method attributes argument
|
50
|
+
# and class defaults with the method argument taking precedence
|
51
|
+
def attribute_values
|
52
|
+
@attributes.is_a?(Hash) ? @attributes.reverse_merge(default_attribute_values) : @attributes
|
55
53
|
end
|
56
54
|
end
|
57
55
|
end
|
@@ -19,23 +19,21 @@ module ActiveManageable
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
22
|
+
# Returns the default order attributes from the class attribute
|
23
|
+
# that can contain an array of attribute names or name & direction strings
|
24
|
+
# or a lambda/proc to execute to return an array of attribute names
|
25
|
+
def default_order
|
26
|
+
defaults[:order].is_a?(Proc) ? instance_exec(&defaults[:order]) : defaults[:order]
|
27
|
+
end
|
24
28
|
|
25
|
-
|
26
|
-
@target = @target.order(get_order_attributes(attributes))
|
27
|
-
end
|
29
|
+
private
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
def order(attributes)
|
32
|
+
@target = @target.order(order_attributes(attributes))
|
33
|
+
end
|
32
34
|
|
33
|
-
|
34
|
-
|
35
|
-
# or a lambda/proc to execute to return an array of attribute names
|
36
|
-
def get_default_order_attributes
|
37
|
-
defaults[:order].is_a?(Proc) ? instance_exec(&defaults[:order]) : defaults[:order]
|
38
|
-
end
|
35
|
+
def order_attributes(attributes)
|
36
|
+
attributes || default_order
|
39
37
|
end
|
40
38
|
end
|
41
39
|
end
|
@@ -20,37 +20,44 @@ module ActiveManageable
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
# Returns the default scopes in a hash of hashes with the key containing the scope name
|
24
|
+
# and value containing an array of scope arguments.
|
25
|
+
#
|
26
|
+
# For example:-
|
27
|
+
# {rock: [], electronic: [], released_in_year: ["1980"]}
|
28
|
+
def default_scopes
|
29
|
+
get_scopes
|
30
|
+
end
|
25
31
|
|
26
|
-
|
27
|
-
get_scopes(scopes).each { |name, args| @target = @target.send(name, *args) }
|
28
|
-
@target
|
29
|
-
end
|
32
|
+
private
|
30
33
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
# and value containing an array of scope arguments.
|
36
|
-
def get_scopes(scopes = nil)
|
37
|
-
scopes ||= defaults[:scopes]
|
34
|
+
def scopes(scopes)
|
35
|
+
get_scopes(scopes).each { |name, args| @target = @target.send(name, *args) }
|
36
|
+
@target
|
37
|
+
end
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
39
|
+
# Accepts a symbol or string scope name, hash containing scope name and argument,
|
40
|
+
# lambda/proc to execute to return scope(s) or an array of those types
|
41
|
+
# and when the argument is blank it uses the class default scopes.
|
42
|
+
# Converts the scopes to a hash of hashes with the key containing the scope name
|
43
|
+
# and value containing an array of scope arguments.
|
44
|
+
def get_scopes(scopes = nil)
|
45
|
+
scopes ||= defaults[:scopes]
|
46
|
+
|
47
|
+
Array.wrap(scopes).map do |scope|
|
48
|
+
case scope
|
49
|
+
when Symbol, String
|
50
|
+
{scope => []}
|
51
|
+
when Hash
|
52
|
+
# ensure values are an array so they can be passed to the scope using splat operator
|
53
|
+
scope.transform_values! { |v| Array.wrap(v) }
|
54
|
+
when Proc
|
55
|
+
# if the class default contains a lambda/proc that returns nil
|
56
|
+
# don't call get_scopes as we don't want to end up in an infinite loop
|
57
|
+
p_scopes = instance_exec(&scope)
|
58
|
+
get_scopes(p_scopes) if p_scopes.present?
|
59
|
+
end
|
60
|
+
end.compact.reduce({}, :merge)
|
54
61
|
end
|
55
62
|
end
|
56
63
|
end
|
@@ -24,21 +24,19 @@ module ActiveManageable
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
# Returns the default select attributes for the method
|
28
|
+
# from the class attribute that can contain an array of attribute names
|
29
|
+
# or a lambdas/procs to execute to return an array of attribute names
|
30
|
+
def default_select(method: @current_method)
|
31
|
+
default_selects = defaults[:select] || {}
|
32
|
+
attributes = default_selects[method.try(:to_sym)] || default_selects[:all] || []
|
33
|
+
attributes.is_a?(Proc) ? instance_exec(&attributes) : attributes
|
34
|
+
end
|
29
35
|
|
30
|
-
|
31
|
-
@target = @target.select(attributes || get_default_select_attributes)
|
32
|
-
end
|
36
|
+
private
|
33
37
|
|
34
|
-
|
35
|
-
|
36
|
-
# or a lambdas/procs to execute to return an array of attribute names
|
37
|
-
def get_default_select_attributes
|
38
|
-
default_selects = defaults[:select] || {}
|
39
|
-
attributes = default_selects[@current_method] || default_selects[:all] || []
|
40
|
-
attributes.is_a?(Proc) ? instance_exec(&attributes) : attributes
|
41
|
-
end
|
38
|
+
def select(attributes)
|
39
|
+
@target = @target.select(attributes || default_select)
|
42
40
|
end
|
43
41
|
end
|
44
42
|
end
|
@@ -20,29 +20,29 @@ module ActiveManageable
|
|
20
20
|
|
21
21
|
included do
|
22
22
|
class_attribute :unique_search, instance_writer: false, instance_predicate: false
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
when Hash
|
33
|
-
evaluate_condition(*unique_search.first)
|
34
|
-
end
|
25
|
+
def unique_search?
|
26
|
+
case unique_search
|
27
|
+
when nil
|
28
|
+
false
|
29
|
+
when TrueClass, FalseClass
|
30
|
+
unique_search
|
31
|
+
when Hash
|
32
|
+
evaluate_condition(*unique_search.first)
|
35
33
|
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
44
|
-
condition == :if ? result : !result
|
38
|
+
def evaluate_condition(condition, method)
|
39
|
+
result = case method
|
40
|
+
when Symbol
|
41
|
+
method(method).call
|
42
|
+
when Proc
|
43
|
+
instance_exec(&method)
|
45
44
|
end
|
45
|
+
condition == :if ? result : !result
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
@@ -5,16 +5,31 @@ module ActiveManageable
|
|
5
5
|
|
6
6
|
included do
|
7
7
|
include ActiveManageable::Methods::Auxiliary::ModelAttributes
|
8
|
+
end
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
def create(attributes:)
|
11
|
+
initialize_state(attributes: attributes)
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
@target = build_object_for_create
|
14
|
+
authorize(record: @target)
|
14
15
|
|
15
|
-
|
16
|
+
model_class.transaction do
|
17
|
+
yield if block_given?
|
18
|
+
create_object
|
19
|
+
rescue ActiveRecord::RecordInvalid
|
20
|
+
false
|
16
21
|
end
|
17
22
|
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def build_object_for_create
|
27
|
+
action_scope.new(attribute_values)
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_object
|
31
|
+
@target.save!
|
32
|
+
end
|
18
33
|
end
|
19
34
|
end
|
20
35
|
end
|
@@ -5,19 +5,34 @@ module ActiveManageable
|
|
5
5
|
|
6
6
|
included do
|
7
7
|
include ActiveManageable::Methods::Auxiliary::Includes
|
8
|
+
end
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
def destroy(id:, options: {})
|
11
|
+
initialize_state(options: options)
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
@target = action_scope
|
14
|
+
includes(@options[:includes])
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
@target = find_object_for_destroy(id: id)
|
17
|
+
authorize(record: @target)
|
17
18
|
|
18
|
-
|
19
|
+
model_class.transaction do
|
20
|
+
yield if block_given?
|
21
|
+
destroy_object
|
22
|
+
rescue ActiveRecord::RecordNotDestroyed
|
23
|
+
false
|
19
24
|
end
|
20
25
|
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def find_object_for_destroy(id:)
|
30
|
+
@target.find(id)
|
31
|
+
end
|
32
|
+
|
33
|
+
def destroy_object
|
34
|
+
@target.destroy!
|
35
|
+
end
|
21
36
|
end
|
22
37
|
end
|
23
38
|
end
|
@@ -6,19 +6,27 @@ module ActiveManageable
|
|
6
6
|
included do
|
7
7
|
include ActiveManageable::Methods::Auxiliary::Includes
|
8
8
|
include ActiveManageable::Methods::Auxiliary::Select
|
9
|
+
end
|
10
|
+
|
11
|
+
def edit(id:, options: {})
|
12
|
+
initialize_state(options: options)
|
13
|
+
|
14
|
+
@target = action_scope
|
15
|
+
includes(@options[:includes])
|
16
|
+
select(@options[:select])
|
9
17
|
|
10
|
-
|
11
|
-
initialize_state(options: options)
|
18
|
+
yield if block_given?
|
12
19
|
|
13
|
-
|
14
|
-
|
15
|
-
|
20
|
+
@target = find_object_for_edit(id: id)
|
21
|
+
authorize(record: @target)
|
22
|
+
|
23
|
+
@target
|
24
|
+
end
|
16
25
|
|
17
|
-
|
18
|
-
authorize(record: @target)
|
26
|
+
private
|
19
27
|
|
20
|
-
|
21
|
-
|
28
|
+
def find_object_for_edit(id:)
|
29
|
+
@target.find(id)
|
22
30
|
end
|
23
31
|
end
|
24
32
|
end
|
@@ -9,40 +9,42 @@ module ActiveManageable
|
|
9
9
|
include ActiveManageable::Methods::Auxiliary::Includes
|
10
10
|
include ActiveManageable::Methods::Auxiliary::Select
|
11
11
|
include ActiveManageable::Methods::Auxiliary::UniqueSearch
|
12
|
+
end
|
13
|
+
|
14
|
+
def index(options: {})
|
15
|
+
initialize_state(options: options)
|
12
16
|
|
13
|
-
|
14
|
-
|
17
|
+
@target = authorization_scope
|
18
|
+
authorize(record: model_class)
|
19
|
+
search(@options[:search])
|
20
|
+
order(@options[:order])
|
21
|
+
scopes(@options[:scopes])
|
22
|
+
page(@options[:page])
|
23
|
+
includes(@options[:includes])
|
24
|
+
select(@options[:select])
|
25
|
+
distinct(unique_search?)
|
15
26
|
|
16
|
-
|
17
|
-
authorize(record: model_class)
|
18
|
-
search(@options[:search])
|
19
|
-
order(@options[:order])
|
20
|
-
scopes(@options[:scopes])
|
21
|
-
page(@options[:page])
|
22
|
-
includes(@options[:includes])
|
23
|
-
select(@options[:select])
|
24
|
-
distinct(unique_search?)
|
27
|
+
yield if block_given?
|
25
28
|
|
26
|
-
|
27
|
-
|
29
|
+
@target
|
30
|
+
end
|
28
31
|
|
29
|
-
|
32
|
+
private
|
30
33
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
+
def authorization_scope
|
35
|
+
action_scope
|
36
|
+
end
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
+
def search(opts)
|
39
|
+
@target
|
40
|
+
end
|
38
41
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
+
def page(opts)
|
43
|
+
@target
|
44
|
+
end
|
42
45
|
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
+
def distinct(value)
|
47
|
+
@target = target.distinct(value)
|
46
48
|
end
|
47
49
|
end
|
48
50
|
end
|
@@ -5,15 +5,23 @@ module ActiveManageable
|
|
5
5
|
|
6
6
|
included do
|
7
7
|
include ActiveManageable::Methods::Auxiliary::ModelAttributes
|
8
|
+
end
|
9
|
+
|
10
|
+
def new(attributes: {})
|
11
|
+
initialize_state(attributes: attributes)
|
12
|
+
|
13
|
+
@target = build_object_for_new
|
14
|
+
authorize(record: @target)
|
8
15
|
|
9
|
-
|
10
|
-
|
16
|
+
yield if block_given?
|
17
|
+
|
18
|
+
@target
|
19
|
+
end
|
11
20
|
|
12
|
-
|
13
|
-
authorize(record: @target)
|
21
|
+
private
|
14
22
|
|
15
|
-
|
16
|
-
|
23
|
+
def build_object_for_new
|
24
|
+
action_scope.new(attribute_values)
|
17
25
|
end
|
18
26
|
end
|
19
27
|
end
|
@@ -6,19 +6,27 @@ module ActiveManageable
|
|
6
6
|
included do
|
7
7
|
include ActiveManageable::Methods::Auxiliary::Includes
|
8
8
|
include ActiveManageable::Methods::Auxiliary::Select
|
9
|
+
end
|
10
|
+
|
11
|
+
def show(id:, options: {})
|
12
|
+
initialize_state(options: options)
|
13
|
+
|
14
|
+
@target = action_scope
|
15
|
+
includes(@options[:includes])
|
16
|
+
select(@options[:select])
|
9
17
|
|
10
|
-
|
11
|
-
initialize_state(options: options)
|
18
|
+
yield if block_given?
|
12
19
|
|
13
|
-
|
14
|
-
|
15
|
-
|
20
|
+
@target = find_object_for_show(id: id)
|
21
|
+
authorize(record: @target)
|
22
|
+
|
23
|
+
@target
|
24
|
+
end
|
16
25
|
|
17
|
-
|
18
|
-
authorize(record: @target)
|
26
|
+
private
|
19
27
|
|
20
|
-
|
21
|
-
|
28
|
+
def find_object_for_show(id:)
|
29
|
+
@target.find(id)
|
22
30
|
end
|
23
31
|
end
|
24
32
|
end
|
@@ -5,19 +5,40 @@ module ActiveManageable
|
|
5
5
|
|
6
6
|
included do
|
7
7
|
include ActiveManageable::Methods::Auxiliary::Includes
|
8
|
+
end
|
9
|
+
|
10
|
+
def update(id:, attributes:, options: {})
|
11
|
+
initialize_state(attributes: attributes, options: options)
|
8
12
|
|
9
|
-
|
10
|
-
|
13
|
+
@target = action_scope
|
14
|
+
includes(@options[:includes])
|
11
15
|
|
12
|
-
|
13
|
-
|
16
|
+
@target = find_object_for_update(id: id)
|
17
|
+
authorize(record: @target)
|
14
18
|
|
15
|
-
|
16
|
-
authorize(record: @target)
|
19
|
+
assign_attributes_for_update
|
17
20
|
|
18
|
-
|
21
|
+
model_class.transaction do
|
22
|
+
yield if block_given?
|
23
|
+
update_object
|
24
|
+
rescue ActiveRecord::RecordInvalid
|
25
|
+
false
|
19
26
|
end
|
20
27
|
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def find_object_for_update(id:)
|
32
|
+
@target.find(id)
|
33
|
+
end
|
34
|
+
|
35
|
+
def assign_attributes_for_update
|
36
|
+
@target.assign_attributes(@attributes)
|
37
|
+
end
|
38
|
+
|
39
|
+
def update_object
|
40
|
+
@target.save!
|
41
|
+
end
|
21
42
|
end
|
22
43
|
end
|
23
44
|
end
|
@@ -17,22 +17,42 @@ module ActiveManageable
|
|
17
17
|
def default_page_size(page_size)
|
18
18
|
defaults[:page] = {size: page_size.to_i}
|
19
19
|
end
|
20
|
+
|
21
|
+
# Class option used when determining whether to create a paginatable collection without counting the total number of records
|
22
|
+
# within the order of precedence based on the (1) method option, or (2) class option, or (3) configuration option
|
23
|
+
def paginate_without_count(without_count = true)
|
24
|
+
self.without_count = without_count
|
25
|
+
end
|
20
26
|
end
|
21
27
|
|
22
28
|
included do
|
23
|
-
|
29
|
+
class_attribute :without_count, instance_writer: false, instance_predicate: false
|
30
|
+
end
|
24
31
|
|
25
|
-
|
26
|
-
@target = @target.page(page_number(opts)).per(page_size(opts))
|
27
|
-
end
|
32
|
+
private
|
28
33
|
|
29
|
-
|
30
|
-
|
34
|
+
def page(opts)
|
35
|
+
@target = @target.page(page_number(opts)).per(page_size(opts)).tap do |target|
|
36
|
+
target.without_count if paginate_without_count?(opts)
|
31
37
|
end
|
38
|
+
end
|
32
39
|
|
33
|
-
|
34
|
-
|
35
|
-
|
40
|
+
def page_number(opts)
|
41
|
+
opts.try(:[], :number)
|
42
|
+
end
|
43
|
+
|
44
|
+
def page_size(opts)
|
45
|
+
opts.try(:[], :size) || defaults.dig(:page, :size)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Determine whether to create a paginatable collection without counting the total number of records
|
49
|
+
# in order of precedence based on the (1) method option, or (2) class option, or (3) configuration option
|
50
|
+
def paginate_without_count?(opts)
|
51
|
+
[
|
52
|
+
opts.try(:[], :without_count),
|
53
|
+
without_count,
|
54
|
+
ActiveManageable.configuration.paginate_without_count
|
55
|
+
].compact.first
|
36
56
|
end
|
37
57
|
end
|
38
58
|
end
|