#ruby #json #hash #datamapper
#ruby #json #хэш #datamapper
Вопрос:
В Ruby / Sinatra с DataMapper и dm-типами в модельном хаке у меня есть этот блок кода:
self.parent.meta[:post_count] = 1
self.parent.save
К сожалению, это не работает — meta, который является столбцом типа JSON, не обновляется. Помогите, пожалуйста?
Ответ №1:
Когда вы изменяете значение сложного свойства, такого как JSON, через его собственный API (#[] в вашем случае), система отслеживания загрязнения в DM, к сожалению, обходится, что означает, что ваш ресурс не будет помечен как загрязненный. Это не тривиальная проблема для решения, но рано или поздно это будет сделано.
На данный момент в качестве обходного пути вы могли бы переопределить все значение свойства meta и увеличить post_count, например:
self.parent.meta = parent.meta.merge("post_count" => parent.meta.fetch("post_count", 0) 1)
Я понимаю, что это выглядит не очень красиво, но другого способа сделать это сейчас нет. Вы могли бы инкапсулировать этот код в метод, подобный increment_post_count
, чтобы сделать его правильным.
Также, пожалуйста, обратите внимание, что вы должны использовать строковые ключи, а не символы.
Комментарии:
1. Хм. Я вижу, что это правильное направление, но код по-прежнему не работает. «неопределенный метод для nil:NilClass»
2. о, извините, в примере предполагалось, что post_count уже установлен. Я только что обновил свой ответ, теперь он должен работать для вас.
3. Правильно ли в данном контексте использование just
parent
вместоself.parent
? (Также собираюсь протестировать это через секунду)