37 lines
1.2 KiB
Ruby
37 lines
1.2 KiB
Ruby
|
# see the detailed Extenders documentation at https://github.com/ddnexus/flex/wiki/Extenders
|
||
|
|
||
|
module FlexSearchExtender
|
||
|
|
||
|
# set this method to restrict this extender to certain types of results
|
||
|
# see the other Flex extenders for reference (https://github.com/ddnexus/flex/tree/master/lib/flex/result)
|
||
|
def self.should_extend?(response)
|
||
|
true
|
||
|
end
|
||
|
|
||
|
def scoped_loaded_collection(options)
|
||
|
options[:scopes] ||= {}
|
||
|
@loaded_collection ||= begin
|
||
|
records = []
|
||
|
# returns a structure like {Comment=>[{"_id"=>"123", ...}, {...}], BlogPost=>[...]}
|
||
|
h = Flex::Utils.group_array_by(collection) do |d|
|
||
|
d.mapped_class(should_raise=true)
|
||
|
end
|
||
|
h.each do |klass, docs|
|
||
|
scope = options[:scopes][klass.name] || klass.scoped
|
||
|
records |= scope.find(docs.map(&:_id))
|
||
|
end
|
||
|
class_ids = collection.map { |d| [d.mapped_class.to_s, d._id] }
|
||
|
# Reorder records to preserve order from search results
|
||
|
records = class_ids.map do |class_str, id|
|
||
|
records.detect do |record|
|
||
|
record.class.to_s == class_str && record.id.to_s == id.to_s
|
||
|
end
|
||
|
end
|
||
|
records.extend Flex::Result::Collection
|
||
|
records.setup(self['hits']['total'], variables)
|
||
|
records
|
||
|
end
|
||
|
end
|
||
|
|
||
|
end
|