18

我想更新updated_at一些记录:

users = User.in_mailing_list
users.update_all(:updated_at => Time.now)

有没有为此目的的捷径,比如users.touch_all方法?

4

5 回答 5

11

不确定 rhernando 的答案是否适用于旧版本的 Ruby,但我认为这是一种更清晰的方法,适用于 Ruby 2+

users.each(&:touch)
  • 注意。正如评论中提到的,这将导致 N 个请求,而不是使用 update_all ,后者将在单个命令中完成。
于 2014-10-23T04:19:39.657 回答
8

你可以这样做:

User.update_all({updated_at: Time.now}, {id: user_ids})

注意:大括号是必需的,否则它会尝试设置updated_at and id,而不是更新updated_at user_ids id中的位置

干杯!

于 2014-12-24T16:07:55.620 回答
6

如果您需要触摸ActiveRelaton记录,则必须使用update_all方法。它在单个事务中触及多条记录:

User.update_all(updated_at: Time.current)
User.where(active: true).update_all(active: false)

但是如果你有Array记录,在这种情况下,你只能each使用update

users.each { |user| user.update(active: true) }

这种情况的缺点:对于每个都user将是一个单独的事务

于 2017-08-03T09:05:01.477 回答
0

不知道从什么时候开始,但解决方案要简单得多:

users = User.in_mailing_list
users.touch_all

或者,如果您不想实例化用户记录:

users = User.in_mailing_list.touch_all
于 2020-05-14T19:41:58.400 回答
-1

这应该这样做:

User.update(users, :updated_at => Time.now)
于 2013-10-18T10:33:41.237 回答