在Rails中使用Postgres HSTORE的商店

时间:2015-09-28 13:44:56

标签: ruby-on-rails postgresql store hstore

我有用户模型,数据库字段'评论'。我使用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类型的数据库字段?我做错了什么?

2 个答案:

答案 0 :(得分:1)

将自定义编码器添加到 store

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

应该有所帮助。

答案 1 :(得分:0)

对于Rails 5和hstore,使用store_accessor代替store

store_accessor :remark, :info
  

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

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