我在寻找一个变化 #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

这将重置的所有属性的错误,附于他们的原始价值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top