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