新手问题 ActiveRecord 优化问题

NeptuneG · 2020年08月24日 · 最后由 NeptuneG 回复于 2020年08月27日 · 1440 次阅读

Tagging 有一个 [:tag_id, :taggable_id, :taggable_type] 的 unique 制约,下面的代码有什么办法可以优化一下么?

def merge_taggings(remained_tag_id, delete_tag_ids)
  Tagging.where(tag_id: delete_tag_ids).each do |tagging|
    if Tagging.exists?(tagging.taggable_id, tagging.taggable_type, tag_id: remained_tag_id)
      tagging.delete
    else
      tagging.update(tag_id: remained_tag_id)
    end
  end
end

先 delete_all 再 update_all 呢

flowerwrong 回复

先 delete_all 就东西可以 update_all 了吧

换个路子试试,直接 update,然后抓 unique 异常,在异常处理中作 delete。性能估计取决于这样的异常多不多了

可以加一个字段,比如 should_delete

然后对Tagging.where(tag_id: delete_tag_ids)做批量更新

冲突时update should_delete = 1,然后再Tagging.where(should_delete:1).delete

这里又不会是瓶颈 优化个啥

hooopo 回复

是的!杠回去了!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号