Ошибка миграции с использованием Globalize
Несколько лет назад (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 году, не работает. Как это возможно? Это то, что я знаю до сих пор.
Метод create_translation_table!
в моем сценарии миграции 2013 года добавляется в таблицу перевода все переводимые поля, найденные в модели, то есть оба :name
а также :title
, ИМХО, это немного странно, потому что этот код фактически выполняет изменения базы данных, которые могли быть добавлены в модель после создания миграции.
Globalize Gem пытается угадать тип :title
и, похоже, сбой, потому что я получаю эту ошибку при выполнении сценария миграции 2013:
Bad field type for field :title (nil), should be :string or :text
Я ищу способ достижения любого из этих вариантов:
- Запретить Globalize создавать столбец для
:title
при запуске сценария миграции 2013 года и создании сценария миграции 2015 года, чтобы добавить этот столбец без таблицы перевода (думаю, этот вариант лучше) - Узнайте, как указать в модели, что
:title
это строка (я уже пробовалtranslates :title, :string
и не похоже на работу).
1 ответ
У меня раньше была похожая проблема, и одним из найденных решений было всегда указывать переведенные атрибуты в миграции:
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