5

Sto riscontrando qualche problema nell'aggiornamento di una colonna JSON delle rotaie in un modello.Postgres Colonna JSON che aggiorna le singole chiavi/attributi con il modulo

Ho un modello OrderItem con una colonna: opzioni con il tipo di dati postgres json.

Ho un modulo in cui sto solo cercando di aggiornare due attributi in quella colonna JSON. Tuttavia, quando eseguo l'azione di aggiornamento dal mio controller, reimposta l'intera colonna delle opzioni solo ai campi nel mio modulo anziché aggiornare semplicemente i due singoli attributi. è un insetto? Sono su Rails 4.2.1 e da quello che ho letto dovrebbe funzionare, e posso aggiornare manualmente i singoli attributi nella console di rails.

Nel mio controller:

def update 
    @order_item.update(order_item_params) 
    respond_with(:update) 
end 

private 

    def order_item_params 
     params.require(:order_item).permit(:product_id, :quantity, options:[:esp, :size]) 
    end 

La mia forma:

<%= f.fields_for :options do |option| %> 
     <%= option.label :size %> 
     <%= option.select :size, options_for_select((5..13), item.options["size"]) %> 
     <%= option.select :esp, options_for_select(["yes","no"], item.options["esp"]) %> 
    <% end %> 

Quando questo modulo viene inviato non aggiorna i singoli attributi. Si ripristina l'intera colonna JSON a solo questi due attributi

Form Data 
utf8:✓ 
_method:patch 
order_item[quantity]:2 
order_item[options][size]:5 
order_item[options][esp]:no 

In console posso aggiornare manualmente gli attributi facilmente ...

o = OrderItem.last 
o.options["esp"] = "yes" 
o.save 

#PERSISTS! 
+0

si erano mai in grado di trovare una soluzione per questo? –

risposta

0

non ho la vostra applicazione completa, ma suppongo che quando inserisci solo questi 2 parametri: non esegue le stesse azioni eseguite nella console. Quando il modulo viene inviato, tutti i tuoi parametri dovrebbero essere accettati e non solo quelli che hai aggiunto al modulo.

Per impedire che - è possibile aggiungere tutti gli altri campi come nascosti e in questo modo per conservare i dati.

0

È possibile specificare manualmente come aggiornare le opzioni json separate dal resto dell'oggetto.

Una strategia potrebbe essere quella di rimuovere le opzioni dai order_item_params consentiti poi fare qualcosa di simile:

def update 
    @order_item.options.merge!(params[:order_item][:options] 
    @order_item.update(order_item_params) 
    respond_with(:update) 
end 
Problemi correlati