我正在开发我的Ruby on Rails应用程序,这个应用程序有一个名为'User'的模型。这个模型有一个名为'remark'的数据库列(在我的Postgres数据库中)。这个“评论”字段属于HSTORE类型。它存储有关此用户的额外信息的哈希值。
我正在使用一种方法,该方法将参数(params [:info])的值保存到带有“info”键的'remark'字段中。这段代码有效。
def save_info_for_user(info)
@user.remark = { :info => info }
@user.save
end
当数据库字段为空时,此代码无效。因此,只有当它至少包含一个键/值对时,才可以保存这样的新值。
def save_info_for_user(info)
@user.remark['info'] = info
@user.save
end
它出现以下错误:
> undefined method `[]=' for nil:NilClass
此代码既不起作用:
def save_info_for_user(info)
@user.remark[:info] = info
@user.save
end
它给出了同样的错误
> undefined method `[]=' for nil:NilClass
经过一些测试后,我发现'评论[:info]'与'评论['info']'
保持不同的价值对我很困惑。
我的问题: 为什么
@user.remark[:info] = info
给出了这个错误。它应该知道数据库字段'remark'是一个哈希值,因为它的类型被定义为HSTORE?
希望有人能解释这里发生的事情,以及如何使这种方法具有前瞻性。
答案 0 :(得分:1)
它应该知道数据库字段'评论'哈希是
类型是一个哈希,好吧,但它当前的值是NULL
(这两个是完全不同的东西)。意思是它不为人知。甚至不是空哈希(因为那将是一个已知的值)。
因此,为了防范此问题,请确保remark
在尝试对其进行任何更新之前至少是空哈希值。
def save_info_for_user(info)
@user.remark ||= {}
@user.remark['info'] = info
@user.save
end
答案 1 :(得分:-2)
请试试这个。希望它对你有用。
def save_info_for_user(info)
@user.remark = { "info" => info }
@user.save
end