Bus*_*ler 9 ruby migration ruby-on-rails
几年前(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
Run Code Online (Sandbox Code Playgroud)
我添加了相应的翻译属性:
translates :name, required: true
Run Code Online (Sandbox Code Playgroud)
现在我想添加一个名为的第二个全球化属性title,所以我将此行添加到MyModel:
translates :title
Run Code Online (Sandbox Code Playgroud)
甚至在编写第二个迁移脚本之前,我就删除了我的数据库并执行所有迁移.
bundle exec rake db:drop db:create db:migrate
Run Code Online (Sandbox Code Playgroud)
我注意到我在2013年写的迁移脚本失败了.这怎么可能?这就是我现在所知道的.
create_translation_table!我的2013迁移脚本中的方法是在转换表中添加模型中找到的所有可翻译字段,即:name和:title.恕我直言,这有点奇怪,因为这段代码实际上正在执行数据库更改,这些更改可能在创建迁移后添加到模型中.
Globalize gem尝试猜测它的类型:title并且它似乎失败了,因为我在执行2013迁移脚本时遇到了这个错误:
Bad field type for field :title (nil), should be :string or :text
我正在寻找一种方法来实现以下任何选项:
:title运行2013迁移脚本创建列,并创建2015迁移脚本以添加此列no te转换表(我认为此选项更好):title一个字符串(我已经尝试过translates :title, :string但似乎不起作用).我之前遇到过类似的问题,找到的解决方案之一是始终在迁移中指定翻译的属性:
def up
MyModel.translated_attribute_names = [:name]
MyModel.create_translation_table! name: :string
end
Run Code Online (Sandbox Code Playgroud)
还建议完全避免全球化生成器并手动创建翻译表:
create_table :my_model_translations do |t|
t.references :my_model
t.string :locale
t.string :name
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
632 次 |
| 最近记录: |