Rails Postgres hstore. БД не обновляется с измененными значениями
Я пытаюсь понять, как использовать hstore, и кажется, что база данных не обновляется, если я пытаюсь изменить значение в моем хеше.
В моей консоли rails я делаю
u = User.new
u.hash_column = {'key' => 'first'}
u.save
Я получаю сообщение в консоли
(0,4 мс) НАЧАТЬ SQL (2.0ms) UPDATE "users" SET "hash_column" = $1, "updated_at" = $2 WHERE... (18,0 мс) COMMIT
и когда я проверяю DB, у столбца есть правильные данные.
теперь, когда я пытаюсь
u.hash_column['key'] = 'second'
модель кажется правильной в консоли
puts u.hash_column
дает { "Ключ" = > "второй" }
однако, когда я пытаюсь сохранить это u.save
в моей консоли я просто получаю (0,3 мс) НАЧАТЬ (0,2 мс) COMMIT
без инструкции обновления, и когда я проверяю БД, данные не изменились.
если я изменяю другой атрибут в пользовательской модели и сохраняю его, hash_column до сих пор не обновляется. Единственный способ, которым я могу изменить hash_column в базе данных, как представляется, назначить полный хеш, например
u.hash_column = {'key' => 'second'}
это то, как он предназначен для работы, или я делаю что-то неправильно?
Ответы
Ответ 1
Это связано с тем, что в настоящее время рельсы отслеживают изменения. Он будет отслеживать изменения только при использовании набора атрибутов (u.hash_column
). Если вы обновите значение в хеше, вы должны уведомить Rails о том, что значение изменилось, вызвав u.hash_column_will_change!
. Это означает, что значение является грязным, и в следующий раз, когда будет вызвано сохранение, он будет сохранен.
Это также влияет на массивы, строки и даты. Если вы вызываете u.string_value.gsub!
или u.array_column << value
, эти изменения не будут сохраняться, не вызывая метод <column>_will_change!
для этих столбцов