Используя Сфинкса Мышления и оставаясь СУХИМ (не повторяйте себя) - PullRequest
3 голосов
/ 22 декабря 2010

В большом проекте, над которым я работаю, у нас есть много моделей, которые мы хотим проиндексировать и найти. Я обнаруживаю, что повторяю вещи снова и снова ... и знаю, что это может быть плохо позже, когда мы внесем изменения!

Есть ли хороший способ сохранить код СУХИМ при использовании Thinking Sphinx? В частности, у меня есть следующий блок кода в каждой модели, которую я хочу проиндексировать:

define_index do
  ... # model specific code goes here
  set_property :delta => true
  has :created_at
end

sphinx_scope(:only_active) do
  { :conditions => { :status => 1 } }
end

Я ожидаю, что этот общий код будет увеличиваться в размере и функциональности по мере развития проекта ... не говоря уже о возможном исправлении ошибок. Поэтому, очевидно, я бы хотел это учесть. Я хотел бы иметь возможность сделать что-то вроде:

define_index_with_common_settings do
  ... # model specific code goes here
end

И иметь общие индексированные атрибуты, которые будут автоматически включены в индекс ... И иметь общие методы и области поиска, связанные с поиском.

Возможно ли это? Как это делается?

1 Ответ

1 голос
/ 29 мая 2012

Вы всегда можете создать миксин, чтобы сделать это:

module CommonSphinxIndexSettings
  extend ActiveSupport::Concern
  module ClassMethods
    def define_index_with_common_settings
      yield self
      set_property :delta => true
      has :created_at
    end

    sphinx_scope(:only_active) do
      { :conditions => { :status => 1 } }
    end
  end
end

Затем добавьте инициализатор, чтобы включить его в AR:

ActiveRecord::Base.send :include, CommonSphinxIndexSettings

Это должно держать все сухим!

Редактировать : я внес небольшое изменение (передавая себя в вызов yield), это важно из-за типа метапрограммирования, используемого ThinkingSphinx. Это решение имеет свои ограничения, но должно быть достаточно для большинства случаев.

...