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