我正在尝试了解如何使用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'}
这是它的工作方式还是我做错了什么?
答案 0 :(得分:22)
这是由于rails当前跟踪更改的方式。它只会在您使用属性设置器(u.hash_column
)时跟踪更改。如果更新哈希值,则必须通过调用u.hash_column_will_change!
通知Rails值已更改。这将值标记为脏,下次调用save时,它将被保留。
这也会影响数组,字符串和日期。如果您致电u.string_value.gsub!
或u.array_column << value
,如果不为这些列调用<column>_will_change!
方法,则不会保留这些更改