update_all在变量中清除我的数组

时间:2016-01-15 12:59:21

标签: ruby-on-rails ruby 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

当我不致电update_all时,users变量是正确的,但当我使用update_all时,我的users变量为空。我怎样才能停止清除我的阵列?我需要从db返回所有用户,这些用户在update_all

之前处于非活动状态

2 个答案:

答案 0 :(得分:3)

来自docs

  

使用给定的详细信息更新当前关系中的所有记录。此方法构造单个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

答案 1 :(得分:1)

@spickermann的回答是正确的。

然而,为了使它更简单,看起来update_all是一个类方法(IE调用类),这表明你应该在初始化类时调用它(之后不作为实例方法) ):

class ReadUserService
  def self.read_users(count)
     User.inactive.limit(count).update_all(status: User.statuses[:active]) #-> this will be returned by default
  end
end

如果你想让它更有说服力,请使用@spickermann的建议。