给定guid
和value
。如果存在记录guid
,请更新其value
. guid
否则,使用该和创建一个新记录value
。无论哪种情况,都返回记录,以便我可以得到它的主键id
。
如何做到这一点:
- 尽可能少的数据库查询
- 尽可能少的代码
给定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 个查询。
This all assumes we are talking SQL - other datastores, such as mongodb, have the concept of an upsert (update or insert) operation
此代码将找到 value = params[:guid] 的对象。如果找到对象,它将返回该对象,否则它将实例化一个新对象,但尚未保存。
your_object = YOU_MODEL.find_or_initialize_by(params[:guid])