3

给定guidvalue。如果存在记录guid,请更新其value. guid否则,使用该和创建一个新记录value。无论哪种情况,都返回记录,以便我可以得到它的主键id

如何做到这一点:

  • 尽可能少的数据库查询
  • 尽可能少的代码
4

2 回答 2

4

最简单的可能是

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

于 2012-06-10T07:59:43.407 回答
1

此代码将找到 value = params[:guid] 的对象。如果找到对象,它将返回该对象,否则它将实例化一个新对象,但尚未保存。

your_object = YOU_MODEL.find_or_initialize_by(params[:guid])
于 2012-06-10T07:12:42.830 回答