我在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
答案 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
的建议。