3

と が与えられguidますvalue。その を持つレコードが存在する場合は、guidその を更新しvalueます。それ以外の場合は、それと で新しいレコードを作成しguidますvalue。どちらの場合でも、主キーを取得できるようにレコードを返しますid

これを行う方法:

  • データベースクエリをできるだけ少なくする
  • できるだけ少ないコード
4

2 に答える 2

4

The simplest thing is probably

object = Model.find_or_initialize_by_guid(guid)
object.update_attributes :value => value

Which always does 2 queries (a find and an insert/update)

If you know ahead of time that collisions are unlikely you could do

begin
  Model.create(:guid => guid, :value => value)
rescue ActiveRecord::RecordNotUnique
  # find and update existing record
end

This requires a unique index on the guid column. It requires 3 queries in the update case but only 1 query in the create case.

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

このコードは、値 = params[:guid] のオブジェクトを見つけます。オブジェクトが見つかった場合は、そのオブジェクトを返します。そうでない場合は、新しいオブジェクトをインスタンス化しますが、まだ保存しません。

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