通过带有太阳黑子的动态场进行索引和排序

时间:2014-02-12 20:08:20

标签: ruby-on-rails solr sunspot

所以我有许多项目可以成为许多不同页面的一部分。所以这是简化模型:

class Page
  #we just need the id for this question
end

class Item
  embeds_many :page_usages
end 

class PageUsage
  field :position, :default => 0
  embedded_in :item
  belongs_to :page  
end

因此page_usage保持每个页面上项目的位置。我想把它放到solr中,这样它就可以为我提供合适的物品和正确的顺序。

我已经研究过动态领域并最终得到类似的东西,但不是很确定。我希望字段基本上是指向项目位置的页面ID:

searchable do
 dynamic_integer :page_usages do
   page_usages.inject({}) do |hash, page_usage|
     hash.merge(page_usage.page_id => page_usage.position)
   end
 end
end

在我的控制器中,我有类似的东西:

Item.search do
  dynamic :page_usages do
    #i have @page.id but not sure how to get all items with the @page.id
  end
end

我需要一些能够检查页面上是否存在该项目的内容,并了解如何将order_by与该位置一起使用。这是可能的,还是我必须找到另一种解决方案?

1 个答案:

答案 0 :(得分:0)

经过大量试验和错误解决了这个问题。

searchable do
 dynamic_integer :page_usages do
   page_usages.inject({}) do |hash, page_usage|
     hash.merge( ("page" + page_usage.page_id.to_s).to_sym => page_usage.position)
   end
 end
end

所以我首先必须将密钥存储为重要的符号。但我遇到的问题是符号中没有引号。因此,如果你在id上调用to_sym,它看起来像是:“123456789”,这将在以后给你一个“错误的常量名称”错误。所以我在id之前抛出一个字符串来创建一个新符号,如下所示:page123456789。

下一步是创建搜索块:

Item.search do
  dynamic :page_usages do
    with ("page" + page.id.to_s).to_sym ).greater_than(-1)
    order_by(("page" + page.id.to_s).to_sym, :asc)
  end
end

通过使用该页面ID,我能够以正确的顺序提取所有正确的项目。我使用大于-1,因为默认情况下我的位置从0开始并从那里开始上升。