给定 guid
和 value
。如果具有该 guid
的记录存在,则更新其 value
。否则,使用该 guid
和 value
创建一个新记录。无论哪种情况,都返回记录,以便我可以获得它的主键 id
。
如何做到这一点:
- 尽可能少的数据库查询
- 尽可能少的代码
最佳答案
最简单的大概就是
object = Model.find_or_initialize_by_guid(guid)
object.update_attributes :value => value
它总是执行 2 个查询(一个查找和一个插入/更新)
如果您提前知道碰撞不太可能发生,您可以这样做
begin
Model.create(:guid => guid, :value => value)
rescue ActiveRecord::RecordNotUnique
# find and update existing record
end
这需要 guid 列上的唯一索引。它在更新案例中需要 3 个查询,但在创建案例中只需要 1 个查询。
这一切都假设我们在谈论 SQL - 其他数据存储,例如 mongodb,具有 upsert(更新或插入)操作的概念
关于ruby-on-rails - 如果存在则更新否则创建。无论哪种情况都返回记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10966958/