14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
# File 'lib/active_facets/acts_as_active_facet.rb', line 14
def acts_as_active_facet(options = {})
acts_as_active_facet_options = options.deep_dup
acts_as_active_facet_options[:includes_method_name] ||= :facet_includes
acts_as_active_facet_options[:apply_includes_method_name] ||= :apply_facet_includes
acts_as_active_facet_options[:filter_method_name] ||= :facet_filter
acts_as_active_facet_options[:apply_filters_method_name] ||= :apply_facet_filters
acts_as_active_facet_options[:unserialize_method_name] ||= :from_json
acts_as_active_facet_options[:serialize_method_name] ||= :as_json
cattr_accessor :acts_as_active_facet_options
self.acts_as_active_facet_options = acts_as_active_facet_options
(class << self; self; end).instance_eval do
define_method(acts_as_active_facet_options[:includes_method_name]) do |facets = :basic, options = {}|
ActiveFacets::ResourceManager.instance.serializer_for(self, options).scoped_includes(facets)
end
define_method(acts_as_active_facet_options[:apply_includes_method_name]) do |facets = :basic, options = {}|
includes(self.send(includes_method_name, facets, options))
end
define_method(acts_as_active_facet_options[:filter_method_name]) do |filter_name, filter_method_name = nil, &filter_method|
filter_method_name ||= "registered_filter_#{filter_name}"
define_singleton_method(filter_method_name, filter_method) if filter_method
ActiveFacets::Filter.register(self, filter_name, filter_method_name)
end
define_method(acts_as_active_facet_options[:apply_filters_method_name]) do |filter_values = nil|
filter_values = (filter_values || {}).with_indifferent_access
ActiveFacets::Filter.registered_filters_for(self).inject(scoped) do |result, (k,v)|
filter = ActiveFacets::ResourceManager.instance.resource_map(self).detect { |map_entry|
filter_values.keys.include? "#{k}_#{map_entry}"
}
args = filter_values["#{k}_#{filter}"] || filter_values[k]
result.send(v, *args) || result
end
end
define_method(acts_as_active_facet_options[:unserialize_method_name]) do |attributes, options = {}|
self.new.send(acts_as_active_facet_options[:unserialize_method_name], attributes, options)
end
end
define_method(acts_as_active_facet_options[:unserialize_method_name]) do |attributes, options = {}|
ActiveFacets::ResourceManager.instance.serializer_for(self.class, options).from_hash(self, attributes)
end
define_method(acts_as_active_facet_options[:serialize_method_name]) do |options = nil|
if options.present? && options.key?(ActiveFacets.opts_key) &&
(serializer = ActiveFacets::ResourceManager.instance.serializer_for(self.class, options)).present?
serializer.as_json(self, options)
else
super(options)
end
end
end
|