2008-09-17 6 views
0

#saveのバリエーションを探していますが、エラーが発生していない の属性のみを保存します。 したがって、モデル全体を有効にすることなくモデルを更新することができ、 は無効なデータのデータベースへの保存を防ぎます。 (:属性)、「有効な属性」、私は@のmodel_instance.errors.onを呼び出すときにnilを与えるそれらの属性を意味することでActiveRecord#save_only_valid_attributes

誰もがこれを実現する方法のアイデアを持っていますか?

はこれまでのところ、私は次のようにあります

def save_valid_attributes 
valid? 
update_atrtibutes attributes.inject({}){|k, v, m| m[k] = v unless errors_on(k.to_sym); m} 
end 

私の場合はそこにある割り当てに行って何も処理は、ありません場合、これは動作します。

def nice_start_date=(startdate) 
self.start_date = Chronic.parse(startdate) || startdate 
end 

def nice_start_date 
self.start_date.to_s 
end 

これらの2つの方法は私が正しく、ユーザーが保存する前に慢性使用して日付を入力し解析することができます: は例えば、私は、定義されたデータベースの列「START_DATE」、および2つのメソッドを持っています。だから、これを行うための第二の方法、一度に一つの属性:日付の1が無効であると保存していない場合、それはすべての更なる属性を防ぐことができます、以来

def save_valid_attributes(attrib) 
    valid? 
    attrib.each{|(k,v)| send("${k}=", v); save; reload) 
end 

モデルは、それぞれの時間を再ロードする必要があります保存から。

これを行うより良い方法はありますか?私はこれがRailsの世界では珍しい問題ではないと確信しています。私は知識のGoogleの世界で何かを見つけることができないようです。

答えて

0

私はあなたの周りに多くの混乱を招くことなく、これでどれくらいの運が得られるのかは分かりません。

どのようにDRYやオブジェクト指向が簡単でフレームワークが簡単であっても(この場合 - alot =)、あなたはそれが覚えておかなければなりません。そのうちの1つはで、フィーチャーと定義されています。それは、すべての変更がコミットされているかどうかを確認するために、最初から設計されています。

あなたは事実上、この標準的な機能を、レールがどのように動作するように設計されているのかを100%上回るもので乗り越えようとしています。これは、すでに矛盾したデータにつながっている可能性が高いです。

と言われています。 。 。いつでも可能です。気になる属性を手動で検証し、組み込みの方法を使用するという行を見ていきます。object.update_attribute_with_validation_skipping.

幸いです!

0

あなたはこのよう#saveを上書きすることができます

def save 
    errors.each do |attr, msg| 
    send("#{attr}=", send("#{attr}_was")) 
    end 
    super 
end 

これは彼らの元の値に接続エラーが発生したすべての属性をリセットします。