3

是否有类似的内置方法update_attributes会忽略作为参数传入的哈希中的无效键?如果不是,那么处理向您发送可能包含或不包含有效密钥的哈希的情况的最佳方法是什么?

4

2 回答 2

1

一种选择是运行 obj.valid?并在调用 update_attributes 之前删除无效键(来自 obj.errors 数组的键)。

def update_valid_attributes(o)  
  o.errors.messages.each do {|k,msg| o.delete k} if !o.valid?
  o.update_attributes
end

如果您希望在所有持久实体中使用此方法,也可以将此方法添加到 ActiveRecord::Base。

于 2012-11-26T19:21:23.167 回答
1

我不知道有什么东西可以在 Rails 中开箱即用地实现这一点。我也不知道有一种简单的方法来确定模型的“定义属性”是什么——因为模型可能具有覆盖的设置器、虚拟属性等。每当我需要这个功能时,我只是明确地定义了类中可接受的符号列表,如下所示:

class Foo < ActiveRecord::Base
  def defined_attributes
    [ :a, :b, :c ]
  end
end

...然后在稍后的某种过滤步骤中使用它:

  attrs = { :a => 1, :z => 0 }
  foo.update_attributes(attrs.slice(*foo.defined_attributes))
于 2012-11-26T19:55:29.743 回答