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! для этих столбцов