0

我正在寻找一种#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 的知识世界中找到任何东西。

4

2 回答 2

0

我不确定如果没有很多麻烦,你会有多少运气。

无论您的框架如何实现 DRY 和 OO 以及多么简单(在这种情况下是 - 很多 =),您仍然必须记住它是在一个沼泽标准关系数据库前面运行的,该数据库具有原子提交作为它的定义之一 特点。它是从头开始设计的,以确保您的所有更改都已提交,或者没有。

您将有效地使用与 rails + 设计工作方式100%背道而驰的标准功能。这很可能导致(如前所述)不一致的数据。

话说回来 。. . 总是有可能的。我会按照对您关心的属性进行手动验证的方式进行查看,然后使用内置方法object.update_attribute_with_validation_skipping.

祝你好运!

于 2008-09-18T00:40:57.613 回答
0

您可以像这样覆盖#save

def save
  errors.each do |attr, msg|
    send("#{attr}=", send("#{attr}_was"))
  end
  super
end

这将重置所有带有错误附加到其原始值的属性。

于 2010-04-14T11:45:45.657 回答