【问题标题】:Rails update attribute table col1 with col2Rails 用 col2 更新属性表 col1
【发布时间】:2013-02-22 08:01:10
【问题描述】:

我想(大规模)更新模型。的每一行都应该通过将 attb 1 的 val 替换为 attr2 的 val 来更新

users = User.find_all_by_project_id(params[:project_id])
users.each do |d|
  User.update_attribute attribute1 with attribute2
end

最好的方法是什么? 感谢您的意见。

【问题讨论】:

    标签: ruby-on-rails mass-assignment


    【解决方案1】:

    你应该这样做,所以一切都发生在 sql 端。

    User.update_all("attribute1 = attribute2", { project_id: params[:project_id] })
    

    【讨论】:

      【解决方案2】:

      应该这样做:

      User.where(:project_id => params[:project_id]).update_all('col1 = col2')
      

      User.update_all('col1 = col2', {:project_id => params['project_id'] })
      

      【讨论】:

      • User.find_all_by_project_id(params[:project_id]).update_all('col1 = col2') 这可能会返回错误。
      • 有效,update_all 声明在 AR::Relation 上,直接调用 update_all 只是委托给 Relation 并应用条件,所以它们基本上是相同的调用。
      • jvnill 是对的,它失败了,因为动态查找器以旧方式工作并返回数组,刚刚使用 3.2.11 进行了测试
      • 我做了:users.each 做 |d| User.update_all('col1 = col2', {:id => d.id }) end
      • 我不知道您的应用逻辑,但请记住它不是最优的 - 它会产生与用户数量一样多的查询。 User.update_all with condition 应该只生成一个更新所有记录的查询。
      猜你喜欢
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 2019-05-22
      相关资源
      最近更新 更多