回归到globalize中的其他列

时间:2015-11-26 10:57:52

标签: ruby-on-rails globalize

globalize/globalize中, 我想回到其他专栏。 样本来源。

class CreatePosts < ActiveRecord::Migration
  def up
    create_table :posts do |t|
      t.string :foo, null: false

      t.timestamps null: false
    end
    Post.create_translation_table! hoge: :string
  end
end
class Post < ActiveRecord::Base
  # this not work. but I want to like this.
  translates :hoge, :fallbacks_for_empty_translations => :foo
end

虽然它似乎是对列hogefoo进行双重管理,但如果列hoge为空,我计划显示列foo的内容。您可以修改开源globalize的内容。

1 个答案:

答案 0 :(得分:0)

如全局化文档中所指定,您不需要将可翻译列添加到表迁移中,而是将其作为创建转换表的参数传递

class CreatePosts < ActiveRecord::Migration
  def up
    create_table :posts do |t|
      # no foo column specified here
      t.timestamps null: false
    end
  Post.create_translation_table! foo: :string
  end
end

class Post < ActiveRecord::Base
  translates :foo, :fallbacks_for_empty_translations => true
end

这不会为每种语言创建单独的列,而是在翻译表中为与主模型表中的每个条目关联的每种语言创建一个新条目。

如果您已正确设置

config.i18n.fallbacks = true

并将:en设置为默认语言,每当缺少特定于语言环境的值时获取foo字段的值将默认为英语值。例如,给定两个帖子(post1post2)并附带数据

[#<Post::Translation id: 1, post_id: 1, locale: "en", foo: 'Italy'>,
  #<Post::Translation id: 2, post_id: 1, locale: "jp", foo: 'Hetalia'>,
  #<Post::Translation id: 3, post_id: 2, locale: "en", foo: 'Finland'>,
  #<Post::Translation id: 4, post_id: 2, locale: "jp", foo: ''>]

如果您的语言环境是日语,您将获得

post1.foo # => 'Hetalia'
post2.foo # => 'Finland'