ruby-on-rails - 每个表的 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 中使用的,只是这次配置不是针对整个数据库,而是以每个表的方式?
这肯定会大大清除我的代码,并在开发过程中提供很大帮助。
解决方案
制作数据库的副本
编辑您在其中创建相关表的迁移以读取:
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
诚然,您需要在每一页上执行此操作,但这比必须在每一页上的每个对象上执行此操作要好。如果您可以在文档中找到它,我相信它可能有一个系统范围的设置。
推荐阅读
- spring - 使用 Spring Batch 时 Spring Data JPA 未保存到数据库
- flutter - 无法在表单上呈现数据
- database - 在 PostgreSQL 中使用继承或添加类型列
- css - dhtmlx 调度器灯箱对齐
- bash - AWK:反斜杠作为众多字段分隔符之一
- python - 无法在 PyCharm 中安装 PyTorch(Python 3.9 / macOS)
- oracle - Oracle SKEWONLY & AUTO => 混合 => 适用于所有列大小
- json - 有没有更快的方法使用 Apps 脚本将 JSON 数据提取到 Google 表格?
- amazon-web-services - DynamoDB 单表设计:如何获取一个类型的所有实体
- sql - 第 1 行第 1 列 (ID) 的批量加载数据转换错误(指定代码页的类型不匹配或无效字符)