Rails Postgres hstore。数据库未使用更改的值进行更新

时间:2014-02-05 12:16:29

标签: ruby-on-rails postgresql

我正在尝试了解如何使用hstore,如果我尝试修改哈希值中的数据,似乎数据库不会更新。

在我的rails控制台中我做

u = User.new
u.hash_column = {'key' => 'first'}
u.save

我在控制台收到一条消息  (0.4ms)BEGIN   SQL(2.0ms)UPDATE“users”SET“hash_column”= $ 1,“updated_at”= $ 2 WHERE ...   (18.0ms)COMMIT 当我签入数据库时​​,该列具有正确的数据

现在我尝试

u.hash_column['key'] = 'second'

模型在控制台中似乎是正确的

puts u.hash_column

给出     { “键”=> “中第二个”}

然而,当我试图保存这个     u.save 在我的控制台中,我得到了    (0.3ms)BEGIN    (0.2ms)COMMIT 没有更新语句,当我检查数据库时数据没有改变。

如果我更改用户模型上的另一个属性并保存,则hash_column仍然不会更新。我可以在数据库中更改hash_column的唯一方法是分配给像

这样的完整哈希
u.hash_column = {'key' => 'second'}

这是它的工作方式还是我做错了什么?

1 个答案:

答案 0 :(得分:22)

这是由于rails当前跟踪更改的方式。它只会在您使用属性设置器(u.hash_column)时跟踪更改。如果更新哈希值,则必须通过调用u.hash_column_will_change!通知Rails值已更改。这将值标记为脏,下次调用save时,它将被保留。

这也会影响数组,字符串和日期。如果您致电u.string_value.gsub!u.array_column << value,如果不为这些列调用<column>_will_change!方法,则不会保留这些更改