我想实现一个方法来检查模型的实例是否只有nil或empty属性,除了id或timestamps。
我已经使用了一个辅助方法,它从Hash中删除一个键并返回剩余的哈希值(question 6227600)
class ActiveRecord::Base
def blank?
self.attributes.remove("id","created_at","updated_at").reject{|attr| self[attr].blank?}.empty?
end
end
我想可能有更简单,有效或更安全的方法来做到这一点。有什么建议吗?
答案 0 :(得分:1)
def blank?
self.attributes.all?{|k,v| v.blank? || %w(id created_at updated_at).include?(k)}
end
我的回答与 tadman 给出的回答几乎相同,但以更简洁的方式表达。 小心两种情况:
- **空白?**不是一个很好的选择作为名称,因为如果你调用** object_a.object_b.blank?**试图知道object_a中是否有object_b,你会得到真的如果对象存在则发生事件。 **空?**似乎是一个更好的名字
- 如果数据库设置默认值,则可能很棘手。
编辑:由于每次迭代构建一个数组都很慢(感谢tadman ),一个更好的解决方案是:
def empty?
ignored_attrs = {'id' => 1, 'created_at' => 1, 'updated_at' => 1}
self.attributes.all?{|k,v| v.blank? || ignored_attrs[k]}
end
答案 1 :(得分:0)
您可以检查attributes
哈希中的所有属性是否都不存在,或者反过来:
class ActiveRecord::Base
def blank?
!self.attributes.find do |key, value|
case (key)
when 'id', 'created_at', 'updated_at'
false
else
value.present?
end
end
end
end
不幸的是,如果分配了任何关系键,这将不会考虑在数据库中使用default
设置的内容。您必须将这些添加为异常,或将值与某种已知的默认状态进行比较。
这种事情可能最好根据具体情况实施。