Я использую следующий подход к интернационализации модели на моем приложении:поиска на основе локала на солнечных пятна Solr
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)
(очевидно) недействителен, и я застрял, пытаясь найти способ индексирования локализованных имен.
Есть ли способ сделать это? Это даже правильный подход для локализованного поиска?
I18n.backend.flattened_translations возвращает NoMethodError: undefined метод 'flattened_translations '. Но в любом случае это не фиксированный набор жанров. Они управляются администратором, и администратор будет устанавливать локализованные имена. – dcarneiro
Я полностью изменил свой ответ, дайте мне знать –
Я использую таблицу genre_localizations как бэкэнд i18n для жанровой таблицы. Жанр has_many GenreLocalizations (по одному для каждой локали), а затем мне просто нужно сделать genre.genre_localizations.find_by_locale (locale) .name, где строка локали установлена I18n.locale – dcarneiro