Ruby on rails ActiveRecord#仅保存_有效的_属性

Ruby on rails ActiveRecord#仅保存_有效的_属性,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在寻找#save方法的变体,它只会保存 没有附加错误的属性。 因此,模型可以在总体上无效的情况下进行更新,这将 仍然防止将无效数据保存到数据库 所谓“有效属性”,我指的是那些在调用@model\u instance.errors.on(:attribute)时给出nil的属性 有人知道如何做到这一点吗 到目前为止,我有以下几点: def save_valid_attributes valid? update_atrtibutes attributes.inject({}){|k, v

我正在寻找
#save
方法的变体,它只会保存 没有附加错误的属性。 因此,模型可以在总体上无效的情况下进行更新,这将 仍然防止将无效数据保存到数据库

所谓“有效属性”,我指的是那些在调用@model\u 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的世界里并不是一个罕见的问题,我只是在谷歌的知识世界里找不到任何东西。

我不确定如果没有大量的混乱,你会有多少运气

无论您的框架如何枯燥、面向对象和简单(在本例中为-alot=),您都必须记住它是在一个bog标准关系数据库前面运行的,它的定义特性之一是原子提交。它从头开始设计,以确保您的所有更改都已提交,或者没有提交

您将有效地超越这一标准功能,完全违背rails+的工作原理。这可能会导致(如前所述)数据不一致

话虽如此。这总是可能的。我会看一下如何对您关心的属性进行手动验证,然后使用内置方法
object。使用\u validation\u跳过更新\u attribute\u。

祝你好运

您可以像这样覆盖
#保存

def save
  errors.each do |attr, msg|
    send("#{attr}=", send("#{attr}_was"))
  end
  super
end
这将重置所有附加到原始值的错误属性