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)
如果您想在SQLjsonb_中完成这一切,那么访问器不会提供任何帮助。您必须自己编写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)]
)