2015-03-27 3 views
3

Каков наилучший способ использования update с полем json. Я хотел бы, чтобы мое поле JSON принимало новые ключи или обновляло существующие ключи, но не перезаписывало все поле. ActiveRecord делает хорошую работу просто обновление полей, которые изменились, но я не понимаю, как применить это к подполей в записи JSon ...Postgres Обновление поля JSON с помощью ActiveRecord

it 'can update settings with a plain object' do 
    integration = Integration.create(
    name: 'Name', 
    json_settings: { 
     key1: 1, 
     key2: 2 
    } 
) 
    integration.update(
    settings: { key2: 2 } 
) 
    // json_settings is now { "key2": 3 } but I want 
    // { "key1": 1, "key2": 3 } 
    expect(integration.json_settings['key1']).to eq('1') // fails 
end 

ответ

3

Ваш код должен выглядеть следующим образом:

it 'can update settings with a plain object' do 
    integration = Integration.create(
    name: 'Name', 
    json_settings: { 
     key1: 1, 
     key2: 2 
    } 
) 
    integration.json_settings = integration.json_settings.merge { key2: 3 } 
    integration.save 
    expect(integration.json_settings['key1']).to eq(1) 
end 
+1

ОК, это было то, что я собирался сделать, но не был уверен, что существует какой-либо рельс, способный обновить это поле с помощью слияния по умолчанию. – typeoneerror

+0

да, мне любопытно, есть ли способ заставить AR сделать атомное обновление. Если нет, то когда это было задано, теперь в AR 5.2. Этот ответ на самом деле не отвечает на вопрос. – jrochkind

+0

@jrochkind Вопрос не был связан ни с одним атомным обновлением. –

Смежные вопросы