Rails I18n通过数据库列

时间:2011-07-14 21:19:03

标签: ruby-on-rails ruby ruby-on-rails-3 internationalization

我有一个遗留数据库表,其中包含name_en和name_es列,并想知道在ActiveRecord中根据用户的i18n偏好进行查询的最佳方法是什么。

我在Rails中看到的i18n实现更倾向于将翻译存储在单独的散列或表中,但我不想改变数据库的结构。

目前在旧的PHP应用程序中,我向mysql查询发送一个参数来替换name_ lang 并返回name_enname_es AS name以便在我调用行时显示标识。

1 个答案:

答案 0 :(得分:12)

您应该创建一个初始值设定项:

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的表。