update_all 在变量中清除我的数组

Kam*_*Kam 3 ruby ruby-on-rails ruby-on-rails-4

我在 Rails 中的小服务

class ReadUserService
  def self.read_users(count)
    users = Users.inactive.limit(count)

    users.update_all(status: User.statuses[:active])

    users.to_a
  end
end
Run Code Online (Sandbox Code Playgroud)

当我不调用时update_allusers变量是正确的,但是当我使用时update_all,我的users变量是空的。我怎样才能停止清除我的阵列?我需要从 db 返回所有用户,这些用户之前处于非活动状态update_all

spi*_*ann 5

文档

使用给定的详细信息更新当前关系中的所有记录。此方法构造单个SQL UPDATE语句并将其直接发送到数据库。它不会实例化所涉及的模型,也不会触发 Active Record 回调或验证。传递给的值update_all不会通过 ActiveRecord 的类型转换行为。它应该只接收可以按原样传递给 SQL 数据库的值。

正如我所强调的:update_all不加载实例化关系中的对象。这意味着users变量只保存了一个关系对象,但没有查询数据库中的匹配记录。关系第一次尝试加载记录是在users.to_a. 但在那个时间点,记录已经被更改(激活)。

要解决此问题,请先加载记录并稍后更新它们:

def self.read_users(count)
  scope = Users.inactive.limit(count)
  users = scope.to_a

  scope.update_all(status: User.statuses[:active])

  users
end
Run Code Online (Sandbox Code Playgroud)