2016-01-12 27 views

回答

1

創建一個可搜索的關注點和一個特殊的索引器類(我把它放在lib/indexer.rb中),它可以與任何ActiveRecord模型一起使用並通過ID查找。

顧慮/ searchable.rb

require 'elasticsearch/model' 

module searchable 
    extend activesupport::concern 

    included do 
    include elasticsearch::model 
    after_touch() {indexer.delay.update(self.class.name, id)} 

    after_commit lambda {indexer.delay.create(self.class.name, id)}, on: :create 
    after_commit lambda {indexer.delay.update(self.class.name, id)}, on: :update 
    after_destroy lambda {indexer.delay.delete(self.class.name, id)} 
    end 

end 

LIB/indexer.rb

class Indexer 
    def self.create(klass_name, id) 
    doc = klass_name.constantize.find(id) 
    doc.__elasticsearch__.index_document 
    end 

    def self.update(klass_name, id) 
    doc = klass_name.constantize.find(id) 
    doc.__elasticsearch__.update_document 
    end 

    def self.delete(klass_name, id) 
    # it's already deleted, so we have to delete it old school 
    doc = klass_name.constantize.new 
    doc.id = id 
    doc.__elasticsearch__.delete_document 
    end 

end