如何更新数千条记录

时间:2014-03-24 12:04:19

标签: ruby-on-rails

我必须根据出生日期列中的值更新年龄列。有数千条记录需要更新。

如何使用rails执行此操作?

这是正确的方法吗?

User.update_all(:age => some_method);

def some_method
  age = Date.today.year - dob.year
end

3 个答案:

答案 0 :(得分:1)

是的,update_all是正确的方法,但不,你不能这样做。您的some_method只会被调用一次以设置数据库调用(我假设您持久保存到数据库)。然后,您会收到错误,因为在dob类的范围内无法识别User

您需要将日期逻辑转换为SQL函数。

像(对于mysql):

User.update_all("age = year(now()) - 
                year(dob) - 
                (DATE_FORMAT(now(), '%m%d') < DATE_FORMAT(dob, '%m%d'))")

(注意:date_format的内容是为了让那些生日晚于当前日期的人的年龄合适 - 请参阅this question了解更多详情)

答案 1 :(得分:0)

另一种选择是在rails中使用其中一个批处理功能。

User.where(some_condition).find_in_batches do |group_of_users|
 # some logic
 # e.g. group_of_users.update_all(:age => some_logic)
end

这将锁定您的数据库更短的时间。请注意,您应该始终更新并考虑到条件。我无法想到很多情况下,每当发生某些事情时你都想要更新整个表格。

结帐rails docsapi

有几个选项

答案 2 :(得分:0)

你的查询是对的。

有很多方法可以批量/批次更新记录。

但是,我认为您的查询是最好的。因为它是rails查询,它将支持所有数据库的所有条件。

用于更新多个属性

Model.update_all(:column1 => value1, :column2 => value2, ........)

你可以使用:

Model.update_all("column1 = value1, column2 = value2, ........")