我正在寻找#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”,并定义了两个方法:
def nice_start_date=(startdate)
self.start_date = Chronic.parse(startdate) || startdate
end
def nice_start_date
self.start_date.to_s
end
这两种方法使我可以在保存之前使用“慢性”正确解析用户输入的日期。 因此,第二种方法是一次设置一个属性:
def save_valid_attributes(attrib)
valid?
attrib.each{|(k,v)| send("${k}=", v); save; reload)
end
每次需要重新加载模型,因为如果其中一个日期无效并且不保存,则它将阻止保存所有其他属性。
有一个更好的方法吗? 我敢肯定,这在Rails界并不是一个普遍的问题,我似乎在Google的知识领域中找不到任何东西。