【问题标题】:Using a store with Postgres HSTORE in Rails在 Rails 中使用带有 Postgres HSTORE 的商店
【发布时间】:2015-12-25 19:00:46
【问题描述】:

我有一个带有数据库字段'remark'用户模型。我使用 Postgres 作为数据库,'remark' 字段的类型是 HSTORE。所以'remark'存储了一个带有额外用户信息的散列。

根据某人的建议,我向我的“用户”模型添加了一个商店,如下所示:

class User < ActiveRecord::Base
  store :remark, accessors: [ :info ]
  #some code
end

现在我可以通过使用此访问器 '@user.info' 来获取 @user.remark['info'] 中的值。这很好用。但是当我尝试设置并保存这样的新值时:

@user.info = "some info"
@user.save

我收到以下错误:

ActiveRecord::StatementInvalid: PG::InternalError: ERROR:  Syntax error near '!' at position 4

这样可以使用 HSTORE 类型的数据库字段吗?我做错了什么?

【问题讨论】:

  • 您发布的代码看起来不错。您确定异常来自设置 hstore 值吗?您是否有任何可能引发错误的回调?生成的 sql update 命令是什么样的(在控制台中尝试或查看您的 rails 日志)。
  • SQL (0.8ms) UPDATE "users" SET "remark" = $1, "updated_at" = $2 WHERE "users"."id" = $3 [["remark", "--- ! ruby/hash:ActiveSupport::HashWithIndifferentAccess\ninfo:dit zou moeten werken\n"], ["updated_at", "2015-09-28 13:22:04.216668"], ["id", 1]] PG:: InternalError: 错误: '!' 附近的语法错误在第 4 位:UPDATE "users" SET "remark" = $1, "updated_at" = $2 WHERE "users"."id" = $3
  • 它是否适用于@user.remark['info'] = "some info"; @user.save
  • no 也不起作用。我刚刚看到@user.save 不起作用。即使我不更改实例。当我从模型中删除“store :remark, accessors: [ :info ]”时,它确实有效。 (使用 rails 4.2 和 ruby​​2.1.1)

标签: ruby-on-rails postgresql store hstore


【解决方案1】:

将自定义编码器添加到商店

class User < ActiveRecord::Base
  store :remark, accessors: [ :info ], coder: HstoreCoder
  #some code
end

HstoreCoder 类:

class HstoreCoder
  class << self
    def load(hash)
      hash
    end

    def dump(value)
      value.to_hash
    end
  end
end

应该有帮助。

【讨论】:

    【解决方案2】:

    对于 Rails 5 和 hstore,使用 store_accessor 而不是 store

    store_accessor :remark, :info
    

    注意:如果您使用 PostgreSQL 特定的列,例如 hstore 或 json,则不需要 .store 提供的序列化。只需使用 .store_accessor 来生成访问器方法。请注意,这些列使用字符串键控哈希,并且不允许使用符号进行访问。

    https://api.rubyonrails.org/classes/ActiveRecord/Store.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 2016-09-01
      • 2017-06-04
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多