Xapian search – acts_as_xapian tip (II)
Saturday, September 20th, 2008Further to my first post on using acts_as_xapian, I have been trying to make xapian work with pagination and association proxies properly
class Lesson < ActiveRecord::Base
# Index user_id as a term in xapian
belongs_to :user
def self.find_with_xapian(search_term, options={})
ActsAsXapian::Search.new([self], search_term, options).results.collect{|x| x[:model]}
end
end
class User < ActiveRecord::Base
has_many :lessons do #Extend this association
# Override the method in lessons
def self.find_with_xapian(search_term, options={})
ActsAsXapian::Search.new([proxy_reflection.klass],
"{proxy_reflection.primary_key_name}:#{proxy_owner.id} #{search_term}", options)
.results.collect{|x| x[:model]}
end
end
end
This will ensure that current_user.locations.find_with_xapian will find the correct number of locations, enabling us to work with pagination, etc. What’s left to do is to get the Search object out so that we can get matches_estimated out. I’ll leave out for next time.
This post was brought to you from Software Freedom Day, New Zealand.