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

#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 ? (Также собираюсь протестировать это через секунду)