问题 将ActiveRecord对象的所有属性(除了id,created_at,updated_at除外)设置为nil的最简单方法是什么?


将ActiveRecord对象的所有属性(除了id,created_at,updated_at除外)设置为nil的最简单方法是什么?


10644
2018-01-06 08:28


起源

老实说,这似乎是一个非常特殊的情况,你能解释一下为什么需要它 - 也许,有一个更好的解决方案。在此期间,看看我的答案。 - lwe
是的,我知道这有点奇怪,但请相信我,这是必要的。谢谢你的回答,工作得很好。 - ben
别客气 :) - lwe


答案:


有一个名为的数组 attribute_names 在模型上,它包含所有属性,因此使用reject来过滤属性:

class Model < AR::Base
  def nilify_attributes!(except = nil)
    except ||= %w{id created_at updated_at}
    attribute_names.reject { |attr| except.include?(attr) }.each { |attr| self[attr] = nil }
  end
end

看到 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-attribute_names


5
2018-01-06 08:49



这对Rails 4.2仍然有效吗? - onebree
看起来像是,方法 attribute_names 仍然存在。 - lwe


如果它是一次性的,你可以在控制器中执行此操作:

@record.update_attributes(Hash[*@record.attributes.except('created_at','updated_at','id').map { |a| [a.first, nil] }.flatten])

5
2018-01-07 04:15





我知道这已经回答了。我也遇到了提出另一种解决方案的相同情况。

record.dup.attributes.keep_if{|k,v| !v.nil?}

这里记录是活动记录对象。


1
2017-12-23 17:23



这对我有用,我正在使用Rails 4.2。一个衬垫很棒。 - onebree
这恰恰相反,但即使你使用 v.nil? (没有爆炸)从散列中删除值和显式设置对象的属性之间存在差异 nil。这是前者,问题是关于后者。 - thisismydesign