You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 7中如何加密PostgreSQL的Integer、时间戳类型数据库列?

Rails 7 Active Record 加密非文本类型列及多列加密方案

核心问题

Active Record Encryption 默认仅支持 string、text 这类文本类型字段加密,直接对 Integer、timestamp 类型字段使用 encrypts 会报错——因为加密后的数据为字符串,无法直接映射回原字段类型。

解决方案:自定义类型转换+多列加密

1. 处理 Integer 类型字段

通过加密前后的回调做类型转换,同时支持批量配置多列:

class People < ApplicationRecord
  # 加密多个Integer类型字段
  encrypts :religion_id, :caste_id, deterministic: true,
           before_encrypt: ->(value) { value.to_s },
           after_decrypt: ->(value) { value.to_i }
end

2. 处理 timestamp 类型字段

将时间转成 ISO8601 字符串加密,解密后再转回 Time 对象:

class People < ApplicationRecord
  # 加密timestamp类型字段
  encrypts :birth_date, deterministic: false,
           before_encrypt: ->(value) { value&.iso8601 },
           after_decrypt: ->(value) { value.present? ? Time.iso8601(value) : nil }

  # 同时混合加密不同类型多列
  encrypts :religion_id, :caste_id, deterministic: true,
           before_encrypt: ->(v) { v.to_s }, after_decrypt: ->(v) { v.to_i }
end

3. 封装通用转换器(可选)

如果多个模型需要处理非文本类型加密,可以封装成模块复用:

module EncryptedNonTextFields
  def encrypts_integer(*attrs, options)
    attrs.each do |attr|
      encrypts attr, options.merge(
        before_encrypt: ->(v) { v.to_s },
        after_decrypt: ->(v) { v.to_i }
      )
    end
  end

  def encrypts_timestamp(*attrs, options)
    attrs.each do |attr|
      encrypts attr, options.merge(
        before_encrypt: ->(v) { v&.iso8601 },
        after_decrypt: ->(v) { v.present? ? Time.iso8601(v) : nil }
      )
    end
  end
end

# 模型中调用
class People < ApplicationRecord
  extend EncryptedNonTextFields

  encrypts_integer :religion_id, :caste_id, deterministic: true
  encrypts_timestamp :birth_date, deterministic: false
end

注意事项

  • deterministic 参数:需要用于查询的字段(如 Integer 类型的religion_id)要设为true,加密后值固定,支持 WHERE 条件查询;无需查询的字段(如 timestamp)设为false,安全性更高。
  • 数据库字段调整:加密后字段存储为字符串,需将原 Integer、timestamp 类型的数据库列改为string或text类型(PostgreSQL 可选用varchar或text)。

内容的提问来源于stack exchange,提问作者Akash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:15:32