2013-02-14 1 views
1

Я использую следующий подход к интернационализации модели на моем приложении:поиска на основе локала на солнечных пятна 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) (очевидно) недействителен, и я застрял, пытаясь найти способ индексирования локализованных имен.

Есть ли способ сделать это? Это даже правильный подход для локализованного поиска?

ответ

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 
+0

I18n.backend.flattened_translations возвращает NoMethodError: undefined метод 'flattened_translations '. Но в любом случае это не фиксированный набор жанров. Они управляются администратором, и администратор будет устанавливать локализованные имена. – dcarneiro

+0

Я полностью изменил свой ответ, дайте мне знать –

+0

Я использую таблицу genre_localizations как бэкэнд i18n для жанровой таблицы. Жанр has_many GenreLocalizations (по одному для каждой локали), а затем мне просто нужно сделать genre.genre_localizations.find_by_locale (locale) .name, где строка локали установлена ​​I18n.locale – dcarneiro