Кодировка Rails ActiveRecord для каждой таблицы - PullRequest
0 голосов
/ 11 октября 2018

Я работаю с устаревшей базой данных в Oracle, где кодировка базы данных установлена ​​на «UTF-8», но таблицы могут быть в любой кодировке, например: «Windows-1252», «Latin1» и т. Д., Из-засохранить совместимость с устаревшим программным обеспечением.Пока мы переносим эти системы в Rails, но между тем они должны сосуществовать одновременно.В моем конкретном случае таблицы, с которыми я работаю, находятся в «Windows-1252».

Вот так настроен мой database.yml:

default: &default
  adapter: oracle_enhanced
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: username
  password: password

development:
  <<: *default
  database: development_database
  encoding: utf8

Проблема в том, что всякий раз, когда я получаю объект ActiveRecord Relation и хочу показать его, мне приходится вручную проходить через негои преобразовать «Windows-1252» в кодировку «UTF-8», используя метод кодирования Ruby.
Например, предположим, что таблица User содержит только два атрибута: id и username, соответствующий код будет выглядеть следующим образом:

<tbody>
  <% @users.each do |user| %>
    <tr>
      <td><%= user.id.encode('UTF-8', 'Windows-1252', invalid: :replace) %></td>
      <td><%= user.username.encode('UTF-8', 'Windows-1252', invalid: :replace)%></td>
    </tr>
  <% end %>
</tbody>

Это не единственная проблема, когда мне нужно сгенерировать JSON из объекта ActiveRecord Relation, я получаю эту ошибку JSON :: GeneratorError: source sequence is illegal / malformed utf-8 и многие другие в зависимости от того, что я хочу сделать.

Вопрос заключается в следующем: есть ли способ установить окончание таблицы прямо в модели, в данном примере: user.rb, и заставить рельсы автоматически преобразовывать исходную кодировку независимо от того, какая она есть, в другую, такую ​​как "UTF8",в некотором роде, используемом в database.yml, только на этот раз конфигурация не для всей базы данных, а для таблицы?

Это, безусловно, сильно очистит мой код и очень поможет в процессе разработки.

1 Ответ

0 голосов
/ 11 октября 2018

Сделайте копию вашей базы данных

Отредактируйте вашу миграцию, где вы создаете нужную таблицу следующим образом:

create_table :users, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|

Повторно импортируйте вашу базу данных

РЕДАКТИРОВАТЬ:

Если ваша база данных не была сформирована в результате миграции rails (как вы, по общему признанию, и предполагали ранее), вы можете явно указать кодировку в файлах ruby:

Как работает магический комментарий (# Encoding: utf-8) в рубиновой работе?

Более подробная информация здесь:

http://graysoftinc.com/character-encodings/ruby-19s-three-default-encodings

По общему признанию, вы должны будете делать это на каждой странице, ноэто лучше, чем делать это на каждом объекте на каждой странице.Я полагаю, что это может быть настройка для всей системы, если вы найдете это в документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...