在Ruby on Rails中测试模型实例是否为“空”的最佳方法是哪种?

时间:2011-10-13 16:39:12

标签: ruby-on-rails ruby activerecord

我想实现一个方法来检查模型的实例是否只有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

我想可能有更简单,有效或更安全的方法来做到这一点。有什么建议吗?

2 个答案:

答案 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设置的内容。您必须将这些添加为异常,或将值与某种已知的默认状态进行比较。

这种事情可能最好根据具体情况实施。