2013-02-14 61 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_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)是(顯然)無效,我被困在努力找到一種方法來索引本地化名稱。

有沒有辦法做到這一點?這甚至是獲得本地化搜索的正確方法嗎?

回答

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:未定義的方法'flattened_translations'。但無論如何,這不是一組固定的流派。它們由管理員管理,管理員將設置本地化名稱。 – dcarneiro 2013-02-15 09:58:33

+0

我完全改變了我的答案,讓我知道 – 2013-02-15 10:53:08

+0

我使用genre_localizations表作爲i18n類型表的後端。體裁的has_many GenreLocalizations(每個區域),然後我只需要做genre.genre_localizations.find_by_locale(區域)。名稱其中locale字符串由I18n.locale – dcarneiro 2013-02-15 10:54:15