ActiveRecord中多个模型的批量更新属性?

Lan*_*ard 10 activerecord ruby-on-rails

我有一个简单has_many的关联,我想从改变属性publicprivate关联的对象.最好的方法是什么:

class User < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
end

user = User.first #=> #<User...>
user.posts.count #=> 100
# something like this:
user.posts.bulk_update_attribute("privacy", "private") #=> 1 DB call
Run Code Online (Sandbox Code Playgroud)

the*_*eIV 33

我相信你正在寻找update_all.

在您的示例中,您将其重写为类似的内容

Post.update_all("privacy = 'private'", ["user_id = ?", user.id])
Run Code Online (Sandbox Code Playgroud)

或者@ jenjenut233指出

user.posts.update_all("privacy = 'private'")
Run Code Online (Sandbox Code Playgroud)

  • 你也可以这样做:user.posts.update_all("privacy ='private'") (2认同)
  • 请注意,这不会执行验证/回调(这可能是也可能不是问题).你也可以写`user.posts.update_all(privacy:"private")` (2认同)