Email#save_only_valid_attributes
-
09-06-2019 - |
题
我在寻找一个变化 #save
方法,只将保存
属性没有错误。这样的模式可以是更新,而不是有效的整体,而这个会
仍阻止救无效数据的数据库。
通过"有效性",我的意思是那些属性给零时呼唤@model_instance.错误。在(:属性)
任何人都有一个主意如何做到这一点?
迄今为止,我有以下几种:
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
该模型需要将重新装载的每一个时间,因为,如果一个日期,是无效的和没有保存,它将防止所有进一步的属性,从节省。
有没有更好的方式做到这一点?我敢肯定这不是一个罕见的问题在该轨道的世界,我只是似乎无法找到任何东西在宇宙的知识。
解决方案
我不知道有多少幸运的,你将不得不与这个没有很多瞎搞。
无论如何干和OO和容易框架使得事情(其是在这种情况下-很=)你还得记住它的运行,在面前的一个沼泽标准的关系数据库,其中有原子的提交作为它的一个 定义 功能.它的设计从地上爬起来,以确保无论是所有的改变都是犯,或没有。
你有效地将随着这个标准功能的东西,去100%针对粮食的多轨+设计工作。这很可能导致(如说已经)向不一致的数据。
具有说。..它总是可能的。我会看着做手册验证的属性关心,然后通过内置方法 object.update_attribute_with_validation_skipping.
祝你好运!
其他提示
你可以复盖 #save
是这样的:
def save
errors.each do |attr, msg|
send("#{attr}=", send("#{attr}_was"))
end
super
end
这将重置的所有属性的错误,附于他们的原始价值。
不隶属于 StackOverflow