Ruby on rails Postgres JSON列使用表单更新单个键/属性

Ruby on rails Postgres JSON列使用表单更新单个键/属性,ruby-on-rails,json,postgresql,activerecord,ruby-on-rails-4.2,Ruby On Rails,Json,Postgresql,Activerecord,Ruby On Rails 4.2,我在更新模型中的rails JSON列时遇到一些问题 我有一个OrderItem模型,其中的:options列具有postgres json数据类型 我有一个表单,其中我只尝试更新JSON列中的两个属性。但是,当我从控制器运行更新操作时,它会将整个选项列重置为表单中的字段,而不仅仅是更新两个单独的属性。这是虫子吗?我使用的是Rails 4.2.1,从我所读到的内容来看,这应该是可行的,我可以在Rails控制台中手动更新各个属性 在我的控制器中: def update @order_item.

我在更新模型中的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
我的表格:

    <%= 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 %>
在控制台中,我可以轻松地手动更新属性

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

#PERSISTS!

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


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

您可以手动指定如何将
选项
json与对象的其余部分分开更新

一种策略是从允许的
订单项目参数中删除选项,然后执行以下操作:

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

你有没有找到解决这个问题的办法?
def update
  @order_item.options.merge!(params[:order_item][:options])
  @order_item.update(order_item_params)
  respond_with(:update)
end