根据Sunspot Solr的区域设置进行搜索

时间:2013-02-14 17:41:05

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

我正在使用以下方法在我的应用上国际化模型:

class GenreLocalization < ActiveRecord::Base
  attr_accessible :genre_id, :name, :locale
end

class Genre < ActiveRecord::Base
  has_many :genre_localizations, :dependent => :destroy

  def name(locale = nil)
    locale ||= I18n.locale
    genre_localizations.find_by_locale(locale).name
  end
end

如果我拨打genre.name,它将返回当前语言环境中的流派名称。

现在我想基于locales使用sunspot solr索引此模型。我的意思是为每行存储idlocalized_namelocale的组合。这样我就能以这种方式搜索流派:

search = Genre.search do
  keywords params[:search]
  with(:locale, 'en')
end

到目前为止,我最好的方法是:

searchable do
  Language.supported_locales.each do |locale|
    integer :id, :stored => true
    text    :name, :stored => true, :using => :name(locale)
    string  :locale
  end
end

但是text :name, :stored => true, :using => :name(locale)行显然是无效的,我一直试图找到一种索引本地化名称的方法。

有办法做到这一点吗?这甚至是获得本地化搜索的正确方法吗?

1 个答案:

答案 0 :(得分:2)

如果这不是一组固定的类型,并且您将翻译存储在该表中,那么只需为每个语言环境创建一个单独的索引字段

searchable do
  integer :id, :stored => true
  Language.supported_locales.each do |locale|
    text :"name_in_#{locale}", :stored => true do
      name(locale)
    end
  end
end

然后限制搜索本地化名称字段,然后

search = Genre.search do
  keywords params[:search] do
     fields(:"name_in_#{current_locale}")
  end
end