Ошибка миграции с использованием 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
Другие вопросы по тегам