在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
虽然它似乎是对列hoge
和foo
进行双重管理,但如果列hoge
为空,我计划显示列foo
的内容。您可以修改开源globalize
的内容。
答案 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字段的值将默认为英语值。例如,给定两个帖子(post1
和post2
)并附带数据
[#<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'