0

だからここに一般的な問題があります:

私は3つのテーブルを持っています、簡単にするためにそれらをa、b、cと呼びます

テーブル
ID

テーブル
bida_id c_id
_

テーブル
CID

したがって、bのレコードは、aとcのレコードを関連付けます。

そして問題:ユーザーがフォームを送信すると、いくつかのハッシュが送信されます。各ハッシュは、入力する必要のあるbのレコードを表します。今は単に削除して再度追加しているだけです。既存の関連付けを繰り返し処理できるようにしたいと思います。データベースに関連付けが送信された(S)よりも多い場合は(ここで注意が必要です)。 DSエントリを削除します。DSが等しい場合は現在のエントリを置き換え、DSが負の場合はSDレコードを追加します。

次に、それらすべてを新しい関連付けに更新します。

ループでこれを試してみましたが、問題はアクティブレコードクエリが配列を返し、繰り返し処理するハッシュがまだあることです。2つのアレイを互いに同期させることができないため、ここからどこに進むべきかわかりません。何か案は?

注:実際のコードを投稿することはできますが、これを処理するコントローラー関数は非常に長いです。


編集:私はここで十分に具体的ではなかったように感じますが、これはすべて手動である必要があると確信していますが、これは私が探しているものの大まかな例です。

submitted_hash[:whatever].each do |key,value|
    #value.first_submit
    #value.second_submit
end

ModelName.find(:all, :conditions => ["fk_ref = ?", params[:fk_ref]]).each do |model_value|
end

ここで、「ModelName.find」が現在「submitted_hash」にあるよりも多くを返す場合は、ニーズを満たすためにさらに参照を作成する必要があります。

「ModelName.find」が「submitted_hash」未満を返す場合、データベースに行として差を追加します。

それらが等しい場合、アクション(この部分で)は必要ありません。

最後に、ModelName.find(:all、:conditions)を使用する必要があります。これにより、ハッシュと同じ量が返されます(これまでに取得しました)。

ここで、どういうわけか、ModelName.findとparams [:subbmited_hash]を同時にループして、レコード1が送信1に置き換えられ、次にレコード2が送信2に置き換えられるようにする必要があります。

注:意図を理解できるように、私がやろうとしているのは、不要な削除を行わずにレコードを置き換えることです。誰かが6を送信して3が必要な場合、コードは6を削除し、 3つの新しいもの。これは機能しますが、更新されるたびに6行(この場合)が完全に削除されます。3つ(2つの値の差)を削除し、残りの3つを新しく送信された値に更新したいと思います。

4

1 に答える 1

1

あなたのテキストは私にはあまり明確ではありませんでしたが、あなたが探している最も近いものはmysqlreplaceコマンドです。

対応する行がない場合は新しい行を挿入し、ない場合は更新を行います。

このような:

  REPLACE INTO b (id, a_id, c_id) VALUES (5, 2, 3);

参照:http ://dev.mysql.com/doc/refman/5.0/en/replace.html

ただし、古い無効なエントリは削除されません。私はあなたがあなた自身のために/手動でそれをする必要があると思います。データベースはこのようには機能しません。

ORMフレームワークでそれを行うことが可能です。レールについては何も知りませんが、このページが役立つかもしれません。

http://blog.gridworlds.com/rails/delete-or-delete-removing-things-in-rails

または、「孤児を削除する」レールを探してみてください

于 2012-08-06T19:39:51.667 に答える