我正在寻找一种#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
这两种方法允许我在保存之前使用 Chronic 正确解析用户输入的日期。所以,第二种方法,一次一个属性:
def save_valid_attributes(attrib)
valid?
attrib.each{|(k,v)| send("${k}=", v); save; reload)
end
每次都需要重新加载模型,因为如果其中一个日期无效且未保存,它将阻止所有进一步的属性保存。
有一个更好的方法吗?我确信这在 Rails 世界中并不少见,我只是似乎无法在 Google 的知识世界中找到任何东西。