【问题标题】:Ruby/Rails ActiveRecord attribute find booleanRuby/Rails ActiveRecord 属性查找布尔值
【发布时间】:2014-09-08 09:57:24
【问题描述】:

我正在寻找一种很好的方法来查找 ActiveRecord 属性是否为布尔值,我在这里有这个方法可以检查摘要属性是否存在或有数据,它通过 value.nil? || value.zero? 执行此操作,但现在我们有一个值可能是布尔值的异常。所以它被NoMethodError: undefined method zero?' for false:FalseClass炸毁了

def self.summary_attribute_status(element)
  # Check if all summary attributes zero or nil
  result = element.class.attributes_for_tag(:summary_attributes).all? do |attribute| 
    value = element.send(attri bute)
    next element
    value.nil? || value.zero? 
  end
  return result ? nil : 'something'
end

我可以这样做:

value.nil? || value.zero? || (!value.is_a? TrueClass || !value.is_a? FalseClass)

但似乎应该有更好的方法来找到它的一般类型,我试着找出它们是否共享一个布尔类型的父类或超类,但它们都继承自 Object < BasicObject。没有别的办法吗?

【问题讨论】:

标签: ruby-on-rails ruby types


【解决方案1】:

还有另一种方法可以检测一个值是否是 ruby​​ 中的布尔值。

!!value == value #true if boolean

但我不认为有任何内置的方法。

【讨论】:

  • 这是一个非常聪明的小方法,我认为这会奏效。我确实在我的 cmets 部分给出的答案中看到了它,所以在这里标记它是正确的,并支持另一个问题。
【解决方案2】:

例如,如果您有一个 User 类具有布尔属性 admin,那么您可以执行以下操作:

User.columns_hash['admin'].type 
# => :boolean

在此处阅读有关columns_hash 的更多信息:http://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-columns_hash

【讨论】:

  • 这是一个非常有趣的方法,在这种情况下它不起作用,因为您调用的摘要属性可能没有您指定摘要属性的列名。但要单独检查,这是王牌
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
相关资源
最近更新 更多