And*_*rew 42 activerecord ruby-on-rails callback ruby-on-rails-3 update-all
假设我在一个名为的数组中有15个用户id user_ids.
如果我想,比如说,将他们所有的名字改为"Bob",我可以这样做:
users = User.find(user_ids)
users.update_all( :name => 'Bob' )
Run Code Online (Sandbox Code Playgroud)
但是,这不会触发回调.如果我需要触发对这些记录保存的回调,据我所知,唯一的方法是使用:
users = User.find(user_ids)
users.each do |u|
u.name = 'Bob'
u.save
end
Run Code Online (Sandbox Code Playgroud)
但是,这可能意味着在控制器操作中执行非常长时间的任务.
所以,我的问题是,是否还有其他更好/更高性能/更多的方式来触发批量更新到一组记录,这些记录会触发记录上的回调?
unt*_*led 40
而不是使用每个/ find_each,update而是尝试使用方法:
models.update(column: value)
Run Code Online (Sandbox Code Playgroud)
iaf*_*nov 22
不,要运行回调,您必须实例化一个昂贵的操作对象.我认为解决问题的唯一方法是将您在回调中执行的操作重构为单独的方法,该方法可以使用select_all方法检索的数据而无需对象实例化.
max*_*m10 19
这是触发回调的另一种方式.而不是使用
models.update_all(params)
Run Code Online (Sandbox Code Playgroud)
您可以使用
models.find_each { |m| m.update_attributes(params) }
Run Code Online (Sandbox Code Playgroud)
但是,如果您处理的是非常大量的数据,我不会推荐这种方法.
希望能帮助到你!
| 归档时间: |
|
| 查看次数: |
21736 次 |
| 最近记录: |