【问题标题】:ruby on rails - indexing ancestry records with Sunspotruby on rails - 使用 Sunspot 索引祖先记录
【发布时间】:2012-07-30 09:44:18
【问题描述】:

我正在尝试索引产品的祖先类别,以便使用 Sunspot 进行分面(和搜索,但如果我能解决一个问题,我会解决另一个问题)。该代码适用于直系父母,但我不知道如何索引祖父母....

在这个场景中,我使用 Ancestry gem 创建了一个类别树结构,每个产品都映射到树中的一个或多个叶节点。

我是 Rails 新手,所以语法对我来说有点陌生,但如果你看到 text:categories 循环,我基本上是在尝试迭代产品的每个祖先并索引每个产品的类别名称产品祖先。

如果你能帮我修正语法或代码,那就太好了。

searchable do
    text :aux_description, :long_description, :name, :on_special, :part_number, :short_description
    text :categories do 

    categories.map { |category| category.name 
        Rails.logger.debug { "indexing category " + category.name }
        category.ancestors.each { |ancestor| ancestor.name
         Rails.logger.debug { "indexing category " + ancestor.name }}
      }
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 solr


    【解决方案1】:

    您传递给text 的块需要返回一个字符串数组。因此,如果您只需要索引类别名称,这将起作用:

    text :categories do
      categories.map { |category| category.name }
    end
    

    如果您还需要索引每个类别的祖先,那么您可以使用一个临时变量并返回它。 (块中的最后一条语句是“返回”值)。

    text :categories do
      names = []
      categories.each { |category| names << category.name }
      categories.each { |category| category.ancestors.each { |ancestor| names << ancestor.name } if category.ancestors }
      names
    end
    

    或者你可以消除局部变量:

    text :categories do
      categories.map { |category| [category.name] + (category.ancestors ? category.ancestors.map { |ancestor| ancestor.name } : []) }.flatten
    end
    

    小心在块的末尾添加日志语句,因为它会改变从该块返回的值。

    【讨论】:

    • 好的,谢谢史蒂夫。我最终以另一种效率较低的方式解决了它。 Ruby 绝对是一门不同于我习惯的语言,当然很有趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多