根据Rails 5中的条件批量修改ActiveRecords

时间:2017-02-22 17:19:25

标签: ruby-on-rails rails-activerecord ruby-on-rails-5

我有一个带有author_id列的模型帖子,我也有一个带有user_id的登录用户

我列出所有帖子:

posts = Post.all

在这个帖子对象中,如果author_id等于当前的user_id,我想检查每个帖子,如果是,我想在对象中添加一个新字段

is_author => true

我知道我应该在我的模型中这样做,但由于几个原因,这是不可能的。

另一个解决方案是遍历所有帖子并添加新字段:

post_with_author = []

post.each do |post|
  add post to new array with new field
end

但这似乎不是最好的选择。

这是否有一种正式的方式?

1 个答案:

答案 0 :(得分:1)

由于您在Post上定义了author_id,因此可以执行

posts = Post.where(author_id: user_id).update_all(author: true)

这将构造并执行单个SQL更新语句,并且不会为每个帖子创建对象。这里需要注意的一点是,update_all会跳过所有验证和回调。