我有一个使用全球化宝石的Rails引擎:
我已有要转换的表,并且按照自述文件中的说明进行操作:
我添加了要翻译的列:
module MyEngine
class Website < ApplicationRecord
translates :name
...
end
end
并创建/修改迁移(复制到我的应用程序中):
class CreateWebsiteTranslations < ActiveRecord::Migration[5.0]
def change
reversible do |dir|
dir.up do
MyEngine::Website.create_translation_table!({
:name => :string
}, {
:migrate_data => true
})
end
dir.down do
MyEngine::Website.drop_translation_table! :migrate_data => true
end
end
end
end
这会在我的数据库中创建一个新的talbe(“ my_engine_website_translations”),其中包括名称列,但是该表为空(名称值未从正在翻译的网站表中获取:
select * from my_engine_website_translations
没有错误:0行受影响
| id | my_engine_website_id | locale | created_at | updated_at | name |
有人知道这是什么原因以及如何解决?
亲切的问候, 乔恩。
答案 0 :(得分:1)
您好Matthieu感谢您的建议,但是,我现在已经找到了问题的根源:
我在模型中对正在转换的同一属性具有默认作用域,在运行create_translation_table迁移时将其删除似乎可以解决问题-现有表中的值现在正在正确迁移...
translates :name
default_scope { order(name: :asc) }
我不确定这是Globalize中的错误还是只是我做错了,但是我可以使用此解决方法:)
谢谢, 乔恩。
答案 1 :(得分:0)
创建翻译表后,您可以尝试手动运行source code:
model = MyEngine::Website
model.find_each do |record|
translation = record.translation_for(I18n.locale) || record.translations.build(:locale => I18n.locale)
fields.each do |attribute_name, attribute_type|
translation[attribute_name] = record.read_attribute(attribute_name, {:translated => false})
end
translation.save!
end
如果成功,则意味着migrate_data
选项确实损坏了,但这似乎不太可能...否则,您就有调试的基础。我看到这不会创建任何数据的唯一原因是您的模型具有某种破坏find_each
的特殊性。我认为成为引擎一部分不会产生任何影响。
希望这会有所帮助。