Rails 想请教大家一个问题。

Nekor · 2018年07月18日 · 最后由 yuzhiyuan413 回复于 2018年07月22日 · 1610 次阅读

是这样的,我想更新数据库中的数据。 假设有这样一个查询出来的对象

@dbdata = tabel.where(:data_type => @type)

还有一个 List

AA = [[1,2,3,4,5],[a,b,c,d,e],[q,w,e,r,y],[z,x,c,v,b],[9,8,7,6,5]]

有没有办法可以批量更新。或者重新组织一下数据批量更新到 DB

可以了解一下update all

AA 是想插入的值/?

torvaldsdb 回复

是的,A 字段插入的值 [1,a,q,z,9],B 字段的值 [2,b,w,x,8],依次类推

Nekor 回复

而且查询出来的数据也一定是五条

ken 回复

感觉 update_all 只能更新一种值,而不能动态的更新每一条数据的值

那就跑五句 sql 呗

values = [[1,2,3,4,5],[9,8,7,6,5]]
attributes = [:attr_1, :attr_2, :attr_3, :attr_4, :attr_5]

pairs = values.map { |v| attributes.zip(v).to_h }
tabel.where(:data_type => @type).each {|rcd| rcd.update_attributes(pairs.shift)}

没有测试过

可以使用 bulk_insert 这个 gem

假如你要更新的字段名依次是 %i(c1 c2 c3 c4 c5)

AA.transpose.map { |date| %i(c1 c2 c3 c4 c5).zip(date).to_h}
# [
#  {:c1=>1, :c2=>:a, :c3=>:q, :c4=>:z, :c5=>9},
#  {:c1=>2, :c2=>:b, :c3=>:w, :c4=>:x, :c5=>8}, 
#  {:c1=>3, :c2=>:c, :c3=>:e, :c4=>:c, :c5=>7},
#  {:c1=>4, :c2=>:d, :c3=>:r, :c4=>:v, :c5=>6},
#  {:c1=>5, :c2=>:e, :c3=>:y, :c4=>:b, :c5=>5}
# ]

剩下的想用什么姿势来更新数据就看你心情了,反正也就一行代码

可以使用 activerecord-import

Nekor 关闭了讨论。 07月16日 20:56
需要 登录 后方可回复, 如果你还没有账号请 注册新账号