2017-03-20 8 views
0

または:アクティブレコードで何を使用するかを決定する方法updateまたはinsertアクティブなレコードに、新しいレコードを挿入するのではなく、新しいレコードをdup(ing)した後に更新する方法を教えてください。

私は鍵としてUUIDを使用しています。

新しいオブジェクトのUUIDクライアント側を生成して、server/dbとの非同期処理を許可します。

例:ユーザーは図面に新しい三角形を追加し、このオブジェクトセットを作成してuuid(AAAと言うことができます)をエディタに配置し、さらに作業できます。それから私はサーバーに更新を送信します。したがって、ユーザーはRTTを待つ必要はありません。

ユーザーが、私はそれを描く、緑の三角形を埋める - > AJAXサーバーに(更新(AAA))

使用は緑色の三角形のコピーを作成し、私はオブジェクトが新しいUUIDを設定して送信コピー

ユーザーヒットを元に戻すBBBするAJAXコピーAAA - BBBを削除する(しかし、そのそのちょうど私のアプリで標準として削除のマークが付けられ、削除されません)AJAXを送って描画からBBBを削除

ユーザーヒットはやり直し - > Iオブジェクトをコピーして新しいUUID(BBBをもう一度)を設定し、AJAXコピーAAAをBBBに送信

BANG私は、DUPを作るのIDを設定し、

new_rec=old_rec.dup 
new_rec.id=new_id #BBB 
new_rec.save (BANG because insert) 

を保存するキー

サーバー側を複製だから私は必要なものの回避策があることを、私は知っている

new_rec=old_rec.dup 
new_rec.id=new_id #BBB 

new_rec.set_method_to_update if Record.exist?(new_id) 

new_rec.save (BANG because insert) 

のようなものですが、簡単な方法が可能ですか?

答えて

1

AFAIKレールは、レコードのpersistedの特性を変更させません。レコードがあればそれを取得して更新する必要があります。

new_rec = Record.find(new_id) 

if new_rec 
    new_rec.deleted = false 
else 
    new_rec = old_rec.dup 
    new_rec.id = new_id 
end 

new_rec.save 
1

DBオブジェクト内の識別子としてプライマリキーのみを考慮して、サーバー側の重複したエントリについて考えます。 IDを持つデータを取得し、見つからなければデータを作成します。私は別のノートで、あなたの質問を見るとわかるように、あなたがRailsの4を使用していると仮定すると、

、あなたはfind_or_create_by

この方法を使用することができます:あなたが行うことができます最初のものではなく、すべてまたは特定の操作上のAJAX呼び出しを行うのです。あなたが設計したUIレベルのモデル階層を扱うために、角度/バックボーンのようなものを使って、インターフェース上で5~10秒の作業を同期させます。ブラウザ上の一時的なUUIDをサーバIDと同期させて置き換えるか、両方のマッピングを保持してください。これは少し役立つかもしれませんが、維持するのはいくらか面倒です。 falseに@new_record

セットし、すべてのレコードに

使用法(モデル...結構です: -

+0

私はそうUUID IDに移行することを決定し、それは野生と醜いだ、私は前にした(同期の一時キーを使用してトラブルを持っていないUUIDを使用します)。元に戻す/やり直しのために重複したエントリが「発生」し、DB内のレコードを直接削除することはできません。 – halfbit

0

は私が必要なものを誤りました。RB)上記

def clear_new_if_not 
    @new_record=!self.class.exists?(self.id) 
end 

とロジック:

new_rec=old_rec.dup 
new_rec.id=new_id #BBB 

new_rec.clear_new_if_not() 

new_rec.save (no bang) 
関連する問題