1

アプリでモデルを国際化するために、次のアプローチを使用しています。

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と、現在のロケールのジャンルの名前が返されます。

sunspot solr次に、ロケールに基づいてこのモデルにインデックスを付けます。id私のアイデアは、localized_nameとの組み合わせをlocale各行に格納することです。このようにして、次の方法でジャンルを検索できます。

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)は(明らかに)無効であり、ローカライズされた名前にインデックスを付ける方法を見つけようとして立ち往生しています。

これを行う方法はありますか?これは、ローカライズされた検索を取得するための正しいアプローチですらありますか?

4

1 に答える 1

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
于 2013-02-14T19:27:13.493 に答える