我有一个使用 Postgres 作为数据库的 Rails 应用程序。
Postrgres 不接受包含空字节的字符串(例如"a \u0000 b"
:)。尝试保存此类数据会导致以下错误:
ActiveRecord::StatementInvalid
PG::UntranslatableCharacter: ERROR: unsupported Unicode escape sequence
我想设置一条适用于我的所有 ActiveRecord 模型的规则,确保每个字符串属性在保存之前都会从中删除空字节。我正在考虑一些可能产生类似于以下示例的效果的东西:
class MyModel < ApplicationRecord
before_save :remove_null_bytes
private
def remove_null_bytes
my_field.delete!("\u0000")
end
end
但应用于每个模型的每个字符串属性,而不必强制重复设置。
我希望将其限制为 Active Record 字符串属性的原因是,该应用程序还处理二进制上传和电子邮件 webhook。这些可能包含合法的空字节,我不希望这些受到新规则的影响。
当您想要规范化所有模型上的所有字符串类型属性时,我会将其添加到
ApplicationRecord
:请注意,这
normalizes
是在 Ruby on Rails 7.1 中引入的,在旧版本中不可用。我正在考虑设置这样的事情
ApplicationRecord
:不过我不确定我是否对元编程和这种方法缺乏可读性感到满意
覆盖 ApplicationRecord 中的 write_attribute 以确保任何字符串属性在分配时都经过清理:
无需添加 before_save 方法