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_all,users变量是正确的,但是当我使用时update_all,我的users变量是空的。我怎样才能停止清除我的阵列?我需要从 db 返回所有用户,这些用户之前处于非活动状态update_all
从文档:
使用给定的详细信息更新当前关系中的所有记录。此方法构造单个
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)
| 归档时间: |
|
| 查看次数: |
793 次 |
| 最近记录: |