首页 > 解决方案 > 每个表的 Rails ActiveRecord 编码

问题描述

我正在使用 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 对象并且我想显示它时,我必须手动循环它并使用 encode Ruby 方法将“Windows-1252”转换为“UTF-8”编码。
例如,假设一个表 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>

这不是唯一的问题,当我需要从 ActiveRecord Relation 对象生成 JSON 时,我会收到此错误JSON :: GeneratorError: source sequence is illegal / malformed utf-8,还有许多其他问题,具体取决于我想要做什么。

问题是:有没有办法在模型中设置表格的编码,在给定的例子中:user.rb,并让 rails 自动将原始编码转换为另一种编码,如“UTF8”,以某种方式在 database.yml 中使用的,只是这次配置不是针对整个数据库,而是以每个表的方式?

这肯定会大大清除我的代码,并在开发过程中提供很大帮助。

标签: ruby-on-rails

解决方案


制作数据库的副本

编辑您在其中创建相关表的迁移以读取:

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

重新导入数据库

编辑:

如果您的数据库不是通过 rails 迁移形成的(正如您之前承认的那样),您可以在 ruby​​ 文件中显式设置编码:

ruby 中的魔术注释(#Encoding: utf-8)是如何工作的?

更多信息在这里:

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

诚然,您需要在每一页上执行此操作,但这比必须在每一页上的每个对象上执行此操作要好。如果您可以在文档中找到它,我相信它可能有一个系统范围的设置。


推荐阅读