我正在寻找#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

这两种方法使我可以在保存之前使用“慢性”正确解析用户输入的日期。 因此,第二种方法是一次设置一个属性:

def save_valid_attributes(attrib) 
  valid?
  attrib.each{|(k,v)| send("${k}=", v); save; reload)
end

每次需要重新加载模型,因为如果其中一个日期无效并且不保存,则它将阻止保存所有其他属性。

有一个更好的方法吗? 我敢肯定,这在Rails界并不是一个普遍的问题,我似乎在Google的知识领域中找不到任何东西。

===============>>#1 票数:0

您可以像这样覆盖#save

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

这将重置所有属性,并在其原始值中附加错误。

===============>>#2 票数:0 已采纳

我不确定在没有太多混乱的情况下您将获得多少运气。

无论DRY和OO如何轻松实现框架(在这种情况下-alot =),您仍然需要记住它运行在沼泽标准关系数据库的前面,该数据库具有原子提交,这是它的定义之一 特点 它是从头开始设计的,以确保所有更改都已提交或不提交。

实际上,您将过度使用此标准功能,而与Rails +的设计工作原理大相径庭。 如前所述,这很可能导致数据不一致。

话说回来 。 总是有可能的。 我会仔细检查一下您关心的属性,然后使用内置方法object.update_attribute_with_validation_skipping.

祝好运!

  ask by bouchard translate from so

未解决问题?本站智能推荐:

1回复

ActiveRecord属性

我在Active Record文件中有以下代码。 我首先改写了postal_code=(postal_code)因为控制器中的params是一个散列,例如( {:first => "1234", :second => "9999"} )。 其次,当我尝试使用getter方法
1回复

无法使用ActiveRecord.update_attributes保存数据

我正在关注Railstutorial,并坚持使用第7章(图7.8附近) 我无法使用ActiveRecord类的update_attributes方法更新属性 我正在采取的确切步骤和错误给了我: 为什么会出现“用户存在”错误? 这很明显,我正在尝试更新,而不是创建数据库条目。
1回复

使用ActiveRecord :: Base#valid只验证一个属性?

我正在寻找一种使用ActiveRecord::Base#valid? 只有一个属性。 考虑以下示例,该示例受RailsGuides的启发: 调用Product#valid? 由于name验证,将触发SQL查询: 现在,我只想验证legacy_code属性: 看到问题
1回复

为什么使用update_attributes或save时ActiveRecord会验证Model的所有列

我有密码验证,其长度必须大于6; 当我保存一个对象时它会工作; 但是当我想像这样更新对象时它也可以工作: 即使我也不想更新密码栏 这是铁轨规则之一吗?
1回复

在具有混合列类型的ActiveRecord对象中仅查找日期属性

我有一个ActiveRecord对象,该对象的属性可以是整数或日期。 我需要查找并返回最旧的日期(忽略created_at和Updated_at字段)。 我以为我可以只查询具有日期类型的属性,然后从那里进行排序,但是这是不可能的,或者我不能正确使用语法。 我可以使用Object.f
1回复

Rails activerecord属性=

我正在这样做: 谁能给我一个线索,为什么执行attribute =会导致一堆SQL显示在我的日志中? 我看到几个SELECT甚至一个UPDATE。 我发誓我没有做“保存”-所以我不知道为什么设置属性会触发查询。 我缺少一个after_ after_过滤器吗? 谢谢
2回复

从ActiveRecord实例中访问RoR ActiveRecord的属性

我对如何从ActiveRecord实例中的方法访问ActiveRecord实例的属性感到困惑。 例如,我有一个从ActiveRecord继承的Lead类: 我有以下按比例缩小的迁移文件,其中显示了ActiveRecord表的列: 我正在使用Lead类的方法中的send来在内
5回复

ActiveRecord如何查找模型的属性?

这是我的问题。 我想知道active record如何访问数据库中的表和列?
1回复

ActiveRecord更改相关的模型属性

我有两个模型Article和ArticleVote 。 当我销毁一篇文章投票(用户取消他的投票)时,我想要改变文章的分数。 所以我做了一个回调。 这是我的ArticleVote模型的样子: 我的ArticleVote#destroy test失败: 失败: 1)
2回复

一次只允许ActiveRecord模型中的多个属性中的一个存在

我试图让它在任何给定时间只能填充三列中的一列。 这是我想到的一些假代码: 是否可以在模型级别执行此操作,或者我是否必须在控制器或参数中管理它?