我必须根据出生日期列中的值更新年龄列。有数千条记录需要更新。
如何使用rails执行此操作?
这是正确的方法吗?
User.update_all(:age => some_method);
def some_method
age = Date.today.year - dob.year
end
答案 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 docs或api。
有几个选项答案 2 :(得分:0)
你的查询是对的。
有很多方法可以批量/批次更新记录。
但是,我认为您的查询是最好的。因为它是rails查询,它将支持所有数据库的所有条件。
用于更新多个属性
Model.update_all(:column1 => value1, :column2 => value2, ........)
或
你可以使用:
Model.update_all("column1 = value1, column2 = value2, ........")