如果存在则更新其他创建。两种情况都返回记录

时间:2012-06-10 07:09:37

标签: ruby-on-rails ruby-on-rails-3

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

如何做到这一点:

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

2 个答案:

答案 0 :(得分: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个查询。

这一切都假设我们正在谈论SQL - 其他数据存储区,例如mongodb,具有upsert(更新或插入)操作的概念

答案 1 :(得分:1)

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

your_object = YOU_MODEL.find_or_initialize_by(params[:guid])