5

Mam problem z aktualizacją kolumny JSON szyn w modelu.Kolumna Postgres JSON aktualizująca poszczególne klucze/atrybuty za pomocą formularza

Mam model OrderItem z kolumną: options z typem danych Postgres Json.

Mam formularz, w którym próbuję tylko zaktualizować dwa atrybuty w tej kolumnie JSON. Jednak po uruchomieniu akcji aktualizacji z kontrolera resetuje ona całą kolumnę opcji tylko do pól w formularzu, a nie tylko aktualizuje dwa poszczególne atrybuty. Czy to błąd? Jestem na Railsach 4.2.1 iz tego co przeczytałem powinno działać, i mogę ręcznie aktualizować poszczególne atrybuty w konsoli rails.

W moim kontrolera:

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 

Moja 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 %> 

Gdy ten formularz jest składany nie aktualizować poszczególne atrybuty. Resetuje całą kolumnę json tylko do tych dwóch atrybutów

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

W konsoli mogę ręcznie aktualizować atrybuty łatwo ...

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

#PERSISTS! 
+0

byłaś kiedykolwiek w stanie znaleźć rozwiązanie tego problemu? –

Odpowiedz

0

nie mam swój pełny wniosek, ale zakładam, że kiedy wprowadzasz tylko te 2 parametry - nie wykonuje tych samych działań, które uruchamiasz w konsoli. Kiedy formularz zostanie przesłany - wszystkie twoje parametry będą akceptowane, a nie tylko te dodane do formularza.

Aby temu zapobiec, możesz dodać wszystkie pozostałe pola jako ukryte, a tym samym zachować dane.

0

Można ręcznie określić sposób aktualizacji opcji json oddzielnie od reszty obiektu.

Jedna strategia mogłaby być usunięcie opcji z dozwolonych order_item_params następnie zrobić coś takiego:

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