2011-07-14 13 views
4

私はカラムname_enとname_esを持つレガシーデータベーステーブルを持っていて、ユーザのi18n設定に基づいてどちらの翻訳を行うにしてもActiveRecordでどのように照会するのが最適かわかりませんでした。Rails I18n via database column

私がRailsで見たi18nの実装は、別々のハッシュやテーブルに翻訳を格納することが多いようですが、データベースの構造を変更したくありません。

は現在、古いPHPアプリに、私はLANG名_ を交換し、私は、行のidを呼び出したときに表示するためのname_enname_es AS nameを返すためにmysqlのクエリに引数を送ります。

+0

[scope](http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html)を使用するとよいアプローチに見えます。 – Zabba

+0

@ Zabba:スコープはそこに実装するには少し長いでしょう – apneadiving

答えて

11

あなたが置くところれる初期化子作成する必要があります。あなたのモデルに続いて

class ActiveRecord::Base 
    def self.has_translation(*attributes)  
    attributes.each do |attribute| 
     define_method "#{attribute}" do 
     self.send "#{attribute}_#{I18n.locale}" 
     end 
    end 
    end 
end 

を:

has_translation :name, :whatever 

それは自動的にあなたの現在のロケールに応じて、適切な列名を呼ぶようにするため。あなたのビューでは:もちろん

@variable.name # calling @variable.name_en if locale = :en 
       #   @variable.name_es if locale = :es 

、私はnameという名前の既存のテーブルがなかったと仮定しました。

+0

それは答えませんか? – apneadiving

+0

素晴らしい作品です!ありがとうございました。 – jyunderwood

+0

あなたは歓迎です、面白い質問btw! – apneadiving