批量更新Rails中的个人记录(PostgreSQL)

时间:2015-03-22 21:22:41

标签: ruby-on-rails ruby postgresql activerecord

我偶然发现了更新一组记录的问题。

在数据库中我有

id | name   | info::hstore | friends[]::varchar 
1  | Claire | {}           | []
2  | Mary   | {}           | []
3  | Bob    | {}           | []

我有一个哈希数组的例子:

[ 
  {id: 1, name: "Claire", info: {age: 21, sex: 'f'}, friends: ['Mary', 'Bob']}, 
  {id: 2, name: "Mary", info: {age: 16, sex: 'f'}, friends: ['Mike']},
  {id: 3, name: "Bob", info: {age: 28, sex: 'm'}, friends: ['James']}
]

所有记录都已经存在于DB中,我只想更新现有的哈希列,哈希都有相同数量的字段要更新:名称,信息和朋友。

有一个gem active-record-import但它只插入。此方法#update_all也不起作用,因为我有个别数据来更新每个记录,具体取决于id。 不想制作原始SQL插入内容,因为我的行包含Postgres hstore和数组类型,不想进行大量数据操作。

可能会有大约10,000 - 100,000条记录需要更新。

环境:Postgres 9.4,Rails 3(如果在Rails4中有一个很好的解决方案,也会很高兴听到)

1 个答案:

答案 0 :(得分:-1)

所以我不确定你是否反对这种方法,但你可以做到:

update_info = [{id: 1, name: "Claire", info: {age: 21, sex: 'f'}, friends: ['Mary', 'Bob']}, 
               {id: 2, name: "Mary", info: {age: 16, sex: 'f'}, friends: ['Mike']},
               {id: 3, name: "Bob", info: {age: 28, sex: 'm'}, friends: ['James']}
                   ]

update_info.each do |row|
  user = User.find(row[:id])
  user.update(info: row[:info], friends: row[:friends])
end

这是将您的信息从哈希数组中提取到数据库中的唯一方法。使用Postgres,您可以使用与连接类似的内容从另一个表进行批量更新。但是,如果您要解决所有问题,那么您应该在数据库控制台psql上执行此操作,或者使用允许您执行SQL查询的GUI DB程序。有些事情在数据库中做得更好,因为这是它的目的。