Postgres JSON列用表单更新单个键/属性

Joe*_*nas 5 postgresql activerecord json ruby-on-rails ruby-on-rails-4.2

我在更新模型中的rails JSON列时遇到了一些问题.

我有一个OrderItem模型,带有:options列和postgres json数据类型.

我有一个表单,我只是尝试更新该JSON列中的两个属性.但是,当我从我的控制器运行更新操作时,它将整个选项列重置为仅我的表单中的字段,而不是仅更新两个单独的属性.这是一个错误吗?我在Rails 4.2.1上,从我读到的应该可以工作,我可以手动更新rails控制台中的各个属性.

在我的控制器中:

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
Run Code Online (Sandbox Code Playgroud)

我的表格:

    <%= 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 %>
Run Code Online (Sandbox Code Playgroud)

提交该表单时,它不会更新各个属性.它将整个json列重置为仅这两个属性

Form Data
utf8:?
_method:patch
order_item[quantity]:2
order_item[options][size]:5
order_item[options][esp]:no
Run Code Online (Sandbox Code Playgroud)

在控制台中我可以轻松地手动更新属性...

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

#PERSISTS!
Run Code Online (Sandbox Code Playgroud)

Tat*_*ata 0

我没有完整的应用程序,但我假设当您仅输入这两个参数时 - 它不会执行您在控制台中运行的相同操作。提交表单后 - 您的所有参数都将被接受,而不仅仅是您添加到表单中的参数。

为了防止这种情况 - 您可以将所有其他字段添加为隐藏字段,这样可以保留数据。