通过Rails Activerecord在Postgres HSTORE中保存第一个键/值对



我正在开发我的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  

相关内容

最新更新