3

重複の可能性:
保存せずにRails update_attributes?

基本的に、ActiveRecordの変更を保留にしたまま、ActiveRecordの「update_attributes」を実行したいと思います。これを達成する方法はありますか?なぜ私がこれを欲しがるのか疑問に思っているなら、読んでください。

静的な部分(互いに独立したテキストフィールド)、選択のセット(エントリが入力されると大きくなる)、および依存するオブジェクトのグループに対する選択の影響を示すセクションの3つの部分で構成されるフォームがあります。選択を変更するには、効果を判断するためにサーバーへのラウンドトリップが必要であり、一部の選択は将来の選択の選択に影響します。選択は、基本モデルからのhas_manyアソシエーションとしてモデル化されます。例([]エントリはHTML-SELECTを指定することに注意してください)

Include [section]
  Exclude [subsection]
  Exclude [subsection]
Include [section]
  Exclude [subsection]
...

フォームを典型的なネストされた属性フォームとして設定しました。選択が変更された場合、通常のparamsハッシュ(例:params [:basemodel] [Associated_models_attributes] [0] [:field_name])を取得するように、AJAXを使用してフィールドをポストバックします。これを未保存のActiveRecordに入れて、元のページの一部を生成するためにすでに使用しているパーシャルを使用してJS応答を生成できるようにします(これにはjs.erbファイルを使用しています)。Basemodel.new(params [:basemodel])を使用すると、エラーが発生します

"ActiveRecord::RecordNotFound (Couldn't find AssociatedModel with ID=1 for Basemodel with ID=)

これは、既存の関連付けられたレコード(現在のレコードに空白以外のIDがある)のIDが、「新しい」呼び出しから生成される空白のIDと一致しないために発生しています(私は思います)。

私は本当に厄介なことをして、ActiveRecordのように見えるものを作成することができました(少なくとも私のパーシャルを満たすのに十分なものです)が、これは十分に一般的な問題であり、それに対する良い解決策があると考えなければなりません。

4

2 に答える 2

7

ActiveRecord::Persistence#update_attributes のソースに応じて

# File activerecord/lib/active_record/persistence.rb, line 127
def update_attributes(attributes)
  # The following transaction covers any possible database side-effects of the
  # attributes assignment. For example, setting the IDs of a child collection.
  with_transaction_returning_status do
    self.attributes = attributes
    save
  end
end

を使用してモデルに属性を割り当てることができます

model.attributes = attributes

ここで、属性はモデル フィールドなどのハッシュです。

于 2011-07-01T06:24:26.157 に答える
4

次のようupdate_attributesに、他の属性をクリアせずにモデルの属性のサブセットを渡し、ハッシュ内の不明な属性を黙って無視できるようにする必要があります。また、ハッシュ キーとして文字列または記号を使用するかどうかも気にする必要はありません。

def set_attributes (attributes)
  attributes.each do |key, value|
    self.send("#{key}=", value) if self.respond_to?("#{key}=")
  end
end
于 2011-07-01T07:19:31.147 に答える