質問

のバリエーションを探しています #save エラーが添付されていない属性のみを保存する方法。したがって、モデルは全体的に有効にならずに更新できますが、これにより、データベースに無効なデータを保存することができなくなります。

「有効な属性」とは、@model_instance.errors.on(:attribute) を呼び出すときに nil を与える属性を意味します。

これを実現する方法を知っている人はいますか?

これまでのところ、次のものがあります。

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

これは、割り当て時に処理が行われていない場合に機能しますが、私の場合は処理が行われています。たとえば、データベース列「start_date」があり、次の 2 つのメソッドが定義されています。

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

def nice_start_date
 self.start_date.to_s
end

これら 2 つの方法により、保存する前に Chronic を使用してユーザーが入力した日付を適切に解析できます。したがって、これを行う 2 番目の方法は、一度に 1 つの属性です。

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

日付の 1 つが無効で保存されない場合、それ以降のすべての属性が保存されなくなるため、モデルは毎回再ロードする必要があります。

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

役に立ちましたか?

解決

かなりいじらずにこれでどれだけの幸運が得られるかはわかりません。

フレームワークがどれだけ DRY で OO で簡単に物事を作ったとしても (この場合は alot =)、フレームワークは、アトミック コミットをその 1 つとして持つ沼地標準のリレーショナル データベースの前で実行されていることを覚えておく必要があります。 定義する 特徴. 。すべての変更がコミットされるか、まったくコミットされないかを確認するように、根本から設計されています。

この標準機能を事実上、rails + がどのように動作するように設計されているかに 100% 反するものでオーバーライドすることになります。これにより、(すでに述べたように) データの不整合が生じる可能性があります。

そうは言っても 。。。それはいつでも可能です。私なら、関心のある属性を手動で検証してから、組み込みメソッドを使用する方法を検討します。 object.update_attribute_with_validation_skipping.

幸運を!

他のヒント

上書きできます #save このような:

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

これにより、元の値にエラーが付加されたすべての属性がリセットされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top