と が与えられguid
ますvalue
。その を持つレコードが存在する場合は、guid
その を更新しvalue
ます。それ以外の場合は、それと で新しいレコードを作成しguid
ますvalue
。どちらの場合でも、主キーを取得できるようにレコードを返しますid
。
これを行う方法:
- データベースクエリをできるだけ少なくする
- できるだけ少ないコード
と が与えられguid
ますvalue
。その を持つレコードが存在する場合は、guid
その を更新しvalue
ます。それ以外の場合は、それと で新しいレコードを作成しguid
ますvalue
。どちらの場合でも、主キーを取得できるようにレコードを返しますid
。
これを行う方法:
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
このコードは、値 = params[:guid] のオブジェクトを見つけます。オブジェクトが見つかった場合は、そのオブジェクトを返します。そうでない場合は、新しいオブジェクトをインスタンス化しますが、まだ保存しません。
your_object = YOU_MODEL.find_or_initialize_by(params[:guid])