0

#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 の知識の世界では何も見つけられないようです。

4

2 に答える 2

0

多くの混乱なしにこれでどれだけの幸運が得られるかはわかりません。

フレームワークがどれほどDRYとOOで簡単に処理できるかに関係なく(この場合は-alot =)、定義の1つとしてアトミックコミットがあるbog-standardリレーショナルデータベースの前で実行されていることを覚えておく必要があります。 機能。すべての変更がコミットされるか、まったくコミットされないようにゼロから設計されています。

レール+が機能するように設計された方法の粒度に100%反する何かで、この標準機能を効果的に乗り越えることになります。これは(すでに述べたように)一貫性のないデータにつながる可能性があります。

そうは言っても 。。。それは常に可能です。気になる属性を手動で検証してから、組み込みの方法を使用するという方針に沿って検討します。object.update_attribute_with_validation_skipping.

幸運を!

于 2008-09-18T00:40:57.613 に答える
0

#save次のように上書きできます。

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

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

于 2010-04-14T11:45:45.657 に答える