2015-09-28 107 views
2

我有一个用户带数据库字段的模型'remark'。我使用Postgres作为数据库,'备注'字段的类型为HSTORE。所以'备注'会存储一个包含额外用户信息的散列。在Rails中使用Postgres HSTORE的商店

正如有人建议我增加了一个商店,这样我的“用户”模式:

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

现在我可以在@ user.remark [“信息”]获得的价值通过这个访问'@ user.info'。这工作正常。但是,当我尝试设置和保存这样一个新值:

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

我得到以下错误:

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

是否有可能使用HSTORE型databasefield这样?我究竟做错了什么?

+0

您发布的代码看起来没问题。你确定这个例外来自设置hstore值吗?你有没有可能会引发错误的回调?生成的sql更新命令的样子是什么(在控制台尝试或查看您的rails日志)。 –

+0

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:ERROR:Syntax error靠近'!'在位置4 :UPDATE“users”SET“remark”= $ 1,“updated_at”= $ 2 WHERE“users”。“id”= $ 3 – MDekker

+0

它可以与'@ user.remark ['info'] =“一些信息“; @ user.save'? – omarvelous

回答

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 

它应该帮助。