通过Rails Activerecord

时间:2015-09-28 09:48:18

标签: ruby-on-rails postgresql hash hstore

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

希望有人能解释这里发生的事情,以及如何使这种方法具有前瞻性。

2 个答案:

答案 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