Sha256: c4e0fa3ccc33856c3f63a76f6148e2baa8d8d10b555b021c1f8855c0380fb165

Contents?: true

Size: 1.41 KB

Versions: 1

Compression:

Stored size: 1.41 KB

Contents

module Dusen
  module ActiveRecord
    class SearchText < ::ActiveRecord::Base

      self.table_name = 'search_texts'

      belongs_to :source, :polymorphic => true, :inverse_of => :search_text

      def update_words!(words)
        update_attributes!(:words => words, :stale => false)
      end

      def invalidate!
        update_attributes!(:stale => true)
      end

      def self.for_model(model)
        Util.append_scope_conditions(scoped({}), :source_type => model.name)
      end

      def self.invalid
        scoped(:conditions => { :stale => true })
      end

      def self.rewrite_all_invalid(model)
        invalid_index_records = for_model(model).invalid
        ids = Util.collect_column(invalid_index_records, :source_id)
        Util.append_scope_conditions(model, :id => ids).each(&:index_search_text)
      end

      def self.match(model, words)
        rewrite_all_invalid(model) if model.search_text?
        Dusen::Util.append_scope_conditions(
          model,
          :id => matching_source_ids(model, words)
        )
      end

      def self.matching_source_ids(model, words)
        conditions = [
          'MATCH (words) AGAINST (? IN BOOLEAN MODE)',
          Dusen::Util.boolean_fulltext_query(words)
        ]
        matching_texts = Dusen::Util.append_scope_conditions(for_model(model), conditions)
        Dusen::Util.collect_column(matching_texts, :source_id)
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dusen-0.3.0 lib/dusen/active_record/search_text.rb