Rails Engine migrate_data не копирует данные в новую переведенную таблицу - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть движок Rails, использующий гем Globalize:

  • рельсы (5.0.7)
  • activerecord (5.0.7)
  • глобализировать (5.1.0)

У меня есть существующие таблицы, которые я хочу перевести, и я следую инструкциям в README:

Я добавляю столбец для перевода:

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 |

Кто-нибудь знает, что вызывает это и как это можно исправить?

С уважением, Jon.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Привет, Матье, спасибо за предложение, однако теперь я нашел источник проблемы:

У меня есть область действия по умолчанию в модели для того же переводимого атрибута, удаление этого при выполнении миграции create_translation_table, похоже, решает проблему - значения из существующей таблицы теперь переносятся правильно ...

translates :name
default_scope { order(name: :asc) }

Я не уверен, является ли это ошибкой в ​​Globalize или просто я что-то не так делаю, но я могу работать с этим обходным путем:)

Спасибо, Jon.

0 голосов
/ 06 сентября 2018

Вы можете попробовать запустить исходный код вручную после создания таблицы переводов:

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. Я не вижу причин, почему участие в двигателе имеет какое-либо влияние.

Надеюсь, это поможет.

...