代码之家  ›  专栏  ›  技术社区  ›  Steven

在Sphinx搜索中包括Rails ActiveRecord方法

  •  1
  • Steven  · 技术社区  · 14 年前

    Thinking Sphinx

    you can't index model methods ,但我愿意。具体来说,我有一个模型,它的实例可以通过 has_many_through acts_as_taggable_on_steroids . 重要的警告:该模型还通过 awesome_nested_set ,我有通过嵌套继承的标记。

    def inherited_tags
      retval = []
      cat = self
      while (cat = cat.parent)
        retval += cat.tags
      end
      retval.uniq
    end
    

    define_index do
      indexes title
      indexes tags(:name)
    end
    

    这个搜索似乎工作得很好,但我很难将它们结合起来,使用户也可以使用继承的标记进行搜索。任何建议都非常感谢!

    1 回复  |  直到 14 年前
        1
  •  2
  •   James Healy    14 年前

    Sphinx只能索引数据库中的数据,这是没有办法的(有一个XML选项,但认为Sphinx不支持它)。

    尝试以下操作:

    class Category < ActiveRecord::Base
       define_index do
         indexes title
         indexes cached_tags, :as => :tags
       end
    
       before_validate :cache_tags       
    
       def ancestors
         if self.parent
           self.parent.ancestors + [self.parent]
         else
           []
         end
       end
    
       def inherited_tags
         ancestors.map { |cat| cat.tags }.flatten.uniq
       end
    
       private
    
       def cache_tags
         self.cached_tags ||= inherited_tags.join(" ")
       end      
    end