Ruby on rails postgres 9.4,pgcrypto 0.4.1,rails 4.2.0,ruby 2.2.0,引用预期字符串,获得Arel::Nodes::BindParam

Ruby on rails postgres 9.4,pgcrypto 0.4.1,rails 4.2.0,ruby 2.2.0,引用预期字符串,获得Arel::Nodes::BindParam,ruby-on-rails,postgresql,pgcrypto,Ruby On Rails,Postgresql,Pgcrypto,尝试创建加密列时出现问题。OSX10.9.5 使用gnupg 2.0.22创建公钥/私钥: gpg -a --export > myKey .key.pub gpg -a --export-secret-key myKey > .key.prv 有关于这里可能发生的事情的指示吗?我有一个带有ssn字段的模型 迁移添加为: add_column :users, :ssn, :binary 在用户模型中 has_encrypted_column :ss

尝试创建加密列时出现问题。OSX10.9.5

使用gnupg 2.0.22创建公钥/私钥:

    gpg -a --export > myKey .key.pub
    gpg -a --export-secret-key myKey > .key.prv
有关于这里可能发生的事情的指示吗?我有一个带有ssn字段的模型 迁移添加为:

    add_column :users, :ssn, :binary
在用户模型中

    has_encrypted_column :ssn
将pgcrpyto扩展添加到开发数据库

在config/initializers/pgcrypto.rb中

    PGCrypto.keys[.public] = {path: '.key.pub'}
    PGCrypto.keys[.private] = {path: '.key.prv',armored: true, password: 'myPassword'}
轨道c

    User.create(username:'x',ssn:'123-45-6789')
获取此错误,列为ssn,因此看起来它正在做正确的事情

TypeError: wrong argument type Arel::Nodes::BindParam (expected String)
from ... /vendor/ruby/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/quoting.rb:19:in `escape_string'
from ... /vendor/ruby/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/quoting.rb:19:in `quote_string'
from ... /vendor/ruby/2.2.0/gems/pgcrypto-0.4.1/lib/pgcrypto/adapter.rb:51:in `pgcrypto_encrypt_string'
以下****是我假设错误的地方,但不确定在这里调用什么方法: 找不到有关Arel::Nodes::BindParam的详细文档。我假设这应该将值设置为“123-45-6789”,然后使用pgcrypto\u encrypt\u字符串调用对其进行加密。我确认钥匙是正确的

     57     def pgcrypto_insert(arel)
     58       if table = PGCrypto[arel.ast.relation.name.to_s]
     59         arel.ast.columns.each_with_index do |column, i|
     60           if options = table[column.name.to_sym]
     61             key = options[:key] || PGCrypto.keys[:public]
     62             next unless key
     63             # Encrypt encryptable columns
     64   *****     value = arel.ast.values.expressions[i]
     65             arel.ast.values.expressions[i] = pgcrypto_encrypt_string(value, key)
     66           end
     67         end
     68      end
     69    end

非常感谢您的指点。很高兴在解决问题时进行分叉并执行拉取请求。

猜测这是由于Rails 4.2.0中的Arel 6.0造成的

在rails 4.1.0中,Arel 5.0

    Arel::Nodes::BindParams < Arel::Nodes::SqlLiteral < String < Object < BasicObject
Arel::Nodes::BindParams
在rails 4.2.0和Arel 6.0中

    Arel::Nodes::BindParams < Arel::Nodes::Node < Object < BasicObject
Arel::Nodes::BindParams

关于如何从Arel::Nodes::Node提取值的任何提示

我目前正致力于解决这个问题。正如您在下面所猜测的,这确实是由于Rails 4.2和Arel 6.0引入的更改。修复是不平凡的,但我计划将其作为PR提交给pgcrypto gem。我会让你知道,当我得到它的工作!您可以在上找到与Rails 4.2配合使用的pgcrypto gem分支。它还增加了对对称加密的支持(在初始化器文件中设置
PGCrypto.mode=:symmetric
PGCrypto.keys[:symmetric]='your_key'
)。我修改了宝石很重,我确定我还没有覆盖所有的边缘情况,所以请考虑这个叉子实验,让我知道如果你看到任何错误或异常行为。谢谢