我正在开发我的Ruby on Rails应用程序,这个应用程序有一个名为'User'的模型。这个模型有一个数据库列(在我的Postgres数据库)称为"remark"。这个'remark'字段的类型是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
经过一些测试,我发现'remark[:info]'与'remark['info']'
拥有不同的值我很困惑。
我的问题:为什么
@user.remark[:info] = info
给出这个错误。它应该知道数据库字段'remark'是一个哈希,因为它的类型被定义为HSTORE?
希望有人能解释一下这里发生了什么,以及如何使这种方法经得起未来的考验。
它应该知道数据库字段'remark'是一个散列
它的类型是一个散列,但是它当前的值是NULL
(这两个是完全不同的东西)。意思是未知的。甚至不是一个空散列(因为那将是一个已知的值)。
因此,为了将来证明这一点,在尝试对其进行任何更新之前,请确保remark
至少是一个空哈希。
def save_info_for_user(info)
@user.remark ||= {}
@user.remark['info'] = info
@user.save
end
请尝试一下。希望它对你有用。
def save_info_for_user(info)
@user.remark = { "info" => info }
@user.save
end