Хэш Datamapper JSON не обновляется

В Ruby/Sinatra с DataMapper и dm-типами в хуке модели у меня есть этот блок кода:

self.parent.meta[:post_count] += 1
self.parent.save

К сожалению, это не работает — метаданные, представляющие собой столбец типа JSON, не обновляются. Помоги пожалуйста?


person Gargron    schedule 23.05.2011    source источник


Ответы (1)


Когда вы изменяете значение сложного свойства, такого как JSON, через его собственный API (#[] в вашем случае), система отслеживания грязных данных в DM, к сожалению, обходится, что означает, что ваш ресурс не будет помечен как грязный. Это не тривиальная проблема, но рано или поздно она будет решена.

На данный момент в качестве обходного пути вы можете переопределить все значение мета-свойства и увеличить значение post_count, например:

self.parent.meta = parent.meta.merge("post_count" => parent.meta.fetch("post_count", 0)+1)

Я понимаю, что это выглядит некрасиво, но сейчас нет другого способа сделать это. Вы можете инкапсулировать этот код в такой метод, как increment_post_count, чтобы сделать его правильным.

Кроме того, обратите внимание, что вы должны использовать строковые ключи, а не символы.

person solnic    schedule 24.05.2011
comment
Хм. Я вижу, что это правильное направление, но код все еще не работает. неопределенный метод + для nil: nilClass - person Gargron; 24.05.2011
comment
о, извините, в примере предполагалось, что post_count уже установлен. Я только что обновил свой ответ, теперь он должен работать на вас. - person solnic; 24.05.2011
comment
Правильно ли в данном контексте использовать только parent вместо self.parent? (Также собираюсь проверить это через секунду) - person Gargron; 24.05.2011