Ruby on rails Ruby-使用jsonb_访问器更新jsonb数组列设置

Ruby on rails Ruby-使用jsonb_访问器更新jsonb数组列设置,ruby-on-rails,ruby,postgresql,jsonb,Ruby On Rails,Ruby,Postgresql,Jsonb,我有一个名为data的字段,它是用jsonb_访问器设置的,如下所示: jsonb_accessor :data, line_items: [:jsonb, array: true, default: []] data: {"line_items"=>[]}, 这在我的合同型号上。当创建合同时,它是一个空数组,如下所示: jsonb_accessor :data, line_items: [:jsonb, array: true, default: []]

我有一个名为
data
的字段,它是用
jsonb_访问器设置的,如下所示:

jsonb_accessor :data,
  line_items: [:jsonb, array: true, default: []]
data: {"line_items"=>[]},
这在我的
合同
型号上。当创建
合同时,它是一个空数组,如下所示:

jsonb_accessor :data,
  line_items: [:jsonb, array: true, default: []]
data: {"line_items"=>[]},
我想向这个空数组添加多个哈希。例如:

{user: "Joe"}
然后,稍后我可以添加散列:

{user: "Jack"}
我尝试过很多事情,但都没有成功,包括:

new = [{user: "Joe"}].to_json
Contract.last.update_all(["line_items = line_items || ?::jsonb", new])
##
Contract.last.update(["line_items = line_items || ?::jsonb", new])
然后我试着推

Contract.last.line_items.push("line_items" => {user: "Todd"})
然后我尝试了
merge

Contract.last.line_items = Contract.last.line_items.merge(new)

没有任何效果。

一个选项就是使用所需的数据设置属性,然后使用
#save
(或
#save!
)将其持久化

尽管我确信有更好的方法来实现相同的功能…

jsonb_访问器意味着您不必手动使用JSON来进行简单的访问器操作。如果要分配给
行项目
请使用
更新像平常一样

contract.update!(line_items: [{user: "Joe"}])
如果要附加到单个合同的
行\u项
,请在Ruby中添加到数组并更新

contract = Contract.last
line_items = contract.line_items + [{user: "Joe"}]
contract.update!(line_items: line_items)
如果您想在SQL
jsonb_中完成这一切,那么访问器不会提供任何帮助。您必须自己编写SQL。要添加到数组,请使用

'{“line_items”,-1}'
表示在键的最后一个元素插入“line_items”,而
true
必须在该点之后插入

contract = Contract.last
line_items = contract.line_items + [{user: "Joe"}]
contract.update!(line_items: line_items)
Contract
  .where(...)
  .update_all(
    q[jsonb_insert(data, '{"line_items", -1}', '{user: "Joe"}', true)]
  )