だからここに一般的な問題があります:
私は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つを新しく送信された値に更新したいと思います。