在Rails ActiveRecord中Upsert

Jas*_*ett 31 activerecord ruby-on-rails upsert

ActiveRecord是否具有内置的upsert功能?我知道我可以自己写,但我显然不想,如果这样的事情已经存在.

And*_*man 14

Model.find_or_initialize可能做你想要的.您可以将它链接起来save或者update_attributes如果有意义的话.

Rails指南中的更多信息.

  • 此解决方案具有并发性问题.如果另一个线程更新`find_or_initialize`和`save`之间的表,它将失败. (9认同)
  • 有没有人见过这会产生一个upsert?rails guide指示新对象尚未存储在DB中,因此我无法看到这是一个真正的DB upsert.即,在多线程环境中无法可靠地工作. (6认同)
  • 看看Pasta的回答评论 (5认同)
  • 这不是一个问题.结果明智,它是等价的(只要像@BarryFruitman提到的并发问题没有发生),但性能明智不是. (5认同)

jac*_*lin 14

我刚跑过这个库:https: //github.com/seamusabshere/upsert

我还没有测试过,但看起来很有希望


Chr*_*ris 7

有一个在轨道6的真棒新功能:他们增加upsertupsert_allActiveRecord

可以在这里找到更多信息https://edgeapi.rubyonrails.org/classes/ActiveRecord/Persistence/ClassMethods.html#method-i-upsert_all

  • 应谨慎使用,因为 upsert 和 upsert_all 都会绕过所有验证和回调。 (7认同)
  • 添加一个如何使用 Maybe 的示例? (4认同)