Rails Engine migrate_data无法将数据复制到新的转换表

时间:2018-09-05 14:07:54

标签: ruby-on-rails globalize

我有一个使用全球化宝石的Rails引擎:

  • 导轨(5.0.7)
  • activerecord(5.0.7)
  • 全球化(5.1.0)

我已有要转换的表,并且按照自述文件中的说明进行操作:

我添加了要翻译的列:

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 |

有人知道这是什么原因以及如何解决?

亲切的问候, 乔恩。

2 个答案:

答案 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的特殊性。我认为成为引擎一部分不会产生任何影响。

希望这会有所帮助。