gpt4 book ai didi

ruby-on-rails - 使用 Globalize 的迁移错误

转载 作者:数据小太阳 更新时间:2023-10-29 06:50:45 27 4
gpt4 key购买 nike

几年前(2013 年)我使用 Globalize 0.3.0、Rails 3.2.21、Ruby 2.1.6 编写了一个迁移程序来全局化我的模型的一个字段:

class CreateMyModelTranslationTable < ActiveRecord::Migration
def up
change_table :my_model do |t|
t.remove :name
end
MyModel.create_translation_table! name: :string
end

def down
change_table :my_model do |t|
t.string :name
end
MyModel.drop_translation_table!
end
end

并且我添加了它对应的翻译属性:

translates :name, required: true

现在我想添加第二个名为 title 的全局化属性,所以我将这一行添加到 MyModel:

translates :title

甚至在编写第二个迁移脚本之前,我就删除了我的数据库并执行了所有迁移。

bundle exec rake db:drop db:create db:migrate

我注意到我在 2013 年编写的迁移脚本失败了。这怎么可能?这是我目前所知道的。

我 2013 年迁移脚本中的方法 create_translation_table! 将模型中找到的所有可翻译字段添加到翻译表中,即 :name:标题。恕我直言,这有点奇怪,因为这段代码实际上正在执行可能在创建迁移后添加到模型中的数据库更改。

Globalize gem 尝试猜测 :title 的类型但它似乎失败了,因为我在执行 2013 迁移脚本时遇到此错误:

字段 :title (nil) 的错误字段类型,应为 :string 或 :text

我正在寻找一种方法来实现这些选项中的任何一个:

  • 防止 Globalize 在运行 2013 迁移脚本时为 :title 创建列,并创建 2015 迁移脚本以添加此列注释转换表(我认为此选项更好)
  • 了解如何在模型中指定 :title 是一个字符串(我已经尝试过 translates :title, :string 但似乎不起作用)。

最佳答案

我之前遇到过类似的问题,找到的解决方案之一是始终在迁移中指定翻译后的属性:

def up
MyModel.translated_attribute_names = [:name]
MyModel.create_translation_table! name: :string
end

还建议完全避免使用全局化生成器并手动创建翻译表:

create_table :my_model_translations do |t|
t.references :my_model
t.string :locale
t.string :name
end

关于ruby-on-rails - 使用 Globalize 的迁移错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34196494/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com