Sha256: c8d5ada6ce528e8165c9758cf750b1ca2951b41117d893fb1c5de557ec36e1b1

Contents?: true

Size: 1.32 KB

Versions: 5

Compression:

Stored size: 1.32 KB

Contents

require "activesearch/algolia/client"
require "activesearch/base"
require "activesearch/proxy"

module ActiveSearch
  def self.search(text, conditions = {})
    Proxy.new(text, conditions) do |text, conditions|
      
      Algolia::Client.new.query(text, tags: conditions_to_tags(conditions))["hits"].map! do |hit|
        if hit["_tags"]
          hit["_tags"].each do |tag|
            k, v = tag.split(':')
            hit[k] = v
          end
          hit.delete("_tags")
        end
        hit
      end
    end
  end
  
  protected
  def self.conditions_to_tags(conditions)
    conditions.map { |c| c.join(':') }.join(',')
  end
  
  module Algolia
    def self.included(base)
      base.class_eval do
        include Base
      end
    end
    
    protected
    def reindex
      algolia_client.save(indexable_id, self.to_indexable)
    end
    
    def deindex
      algolia_client.delete(indexable_id)
    end
    
    def to_indexable
      doc = {}
      search_fields.each do |field|
        doc[field.to_s] = attributes[field.to_s] if attributes[field.to_s]
      end
      
      (Array(search_options[:store]) - search_fields).each do |field|
        doc["_tags"] ||= []
        doc["_tags"] << "#{field}:#{self.send(field)}"
      end
      doc
    end
    
    def algolia_client
      @algolia_client ||= Client.new
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
activesearch-0.1.1 lib/activesearch/algolia.rb
activesearch-0.1.0 lib/activesearch/algolia.rb
activesearch-0.0.16 lib/activesearch/algolia.rb
activesearch-0.0.15 lib/activesearch/algolia.rb
activesearch-0.0.14 lib/activesearch/algolia.rb