如何更新数千条记录

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

我如何使用rails执行此操作?

这是正确的方法吗?

User.update_all(:age => some_method); def some_method age = Date.today.year - dob.year end 

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

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

像(对于mysql):

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

(注意:date_format的内容是为了让那些生日晚于当前日期的人获得正确的年龄 - 有关详细信息,请参阅此问题 )

另一种选择是使用rails中的一个批处理function。

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

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

检查rails docs或api有几个选项。

你的查询是对的。

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

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

用于更新多个属性

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

要么

您可以使用 :

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