lib/fuzzily/searchable.rb in fuzzily-0.3.0 vs lib/fuzzily/searchable.rb in fuzzily-0.3.1

- old
+ new

@@ -34,18 +34,29 @@ private def _find_by_fuzzy(_o, pattern, options={}) options[:limit] ||= 10 + options[:offset] ||= 0 - _o.trigram_class_name.constantize. + trigrams = _o.trigram_class_name.constantize. limit(options[:limit]). + offset(options[:offset]). for_model(self.name). for_field(_o.field.to_s). matches_for(pattern) + records = _load_for_ids(trigrams.map(&:owner_id)) + # order records as per trigram query (no portable way to do this in SQL) + trigrams.map { |t| records[t.owner_id] } end + def _load_for_ids(ids) + {}.tap do |result| + find(ids).each { |_r| result[_r.id] = _r } + end + end + def _bulk_update_fuzzy(_o) trigram_class = _o.trigram_class_name.constantize supports_bulk_inserts = connection.class.name !~ /sqlite/i || @@ -121,13 +132,11 @@ class_variable_set(:"@@fuzzily_searchable_#{field}", true) self end end - module Rails2ClassMethods - include ClassMethods - + module Rails2Rails3ClassMethods private def _add_trigram_association(_o) has_many _o.trigram_association, :class_name => _o.trigram_class_name, @@ -140,12 +149,28 @@ def _with_included_trigrams(_o) self.scoped(:include => _o.trigram_association) end end - Rails3ClassMethods = Rails2ClassMethods + module Rails2ClassMethods + include ClassMethods + include Rails2Rails3ClassMethods + def self.extended(base) + base.class_eval do + named_scope :offset, lambda { |*args| { :offset => args.first } } + end + end + end + + module Rails3ClassMethods + include ClassMethods + include Rails2Rails3ClassMethods + end + + + module Rails4ClassMethods include ClassMethods private @@ -162,6 +187,6 @@ self.includes(_o.trigram_association) end end end -end \ No newline at end of file +end