2015-09-28 40 views
0

我正在开发Ruby on Rails应用程序,并且此应用程序有一个名为'User'的模型。这个模型有一个名为'remark'的数据库列(在我的Postgres数据库中)。这个'评论'字段是HSTORE类型。它存储一个包含有关此用户的额外信息的散列。通过Rails Activerecord在Postgres HSTORE中保存第一个键/值对

我正在使用一种方法,使用'info'键将这个参数(params [: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?

希望有人可以解释这里发生了什么,以及如何使这种方法futureproof。

回答

1

It should know that the database field 'remark' is a hash

是哈希,所有的权利,但其目前的NULL(这两个是完全不同的东西)。这意味着它是未知的。甚至没有空的散列(因为这将是一个已知的值)。

因此,为了确保未来的安全,请确保remark在尝试对其进行任何更新之前至少为空的散列值。

def save_info_for_user(info) 
    @user.remark ||= {} 
    @user.remark['info'] = info 
    @user.save 
    end 
+0

谢谢塞尔吉奥!听起来合乎逻辑 – MDekker

-2

请试试这个。希望它会为你工作。

def save_info_for_user(info) 
    @user.remark = { "info" => info } 
    @user.save 
end 
+0

其实它是为我工作。我已经完成了很多次 – Suneel

+0

你错过了这个问题的关键。 –

相关问题