【问题标题】:How to represent a value from an object as boolean如何将对象中的值表示为布尔值
【发布时间】:2017-11-10 09:32:17
【问题描述】:

正在从 SQL 调用返回以下对象:

#<Health:0x007fc8533f2de8 @type=:diabetic, @value="N", @data_source=nil, @measured_at=nil>

该值可以是“Y”或“N”,可以通过health.value 访问。

如何将此值表示为布尔值?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    如果Health 是一个模型,您可以执行以下操作:

    def diabetic?
      value.upcase == 'Y'
    end
    

    在模型文件中。

    另一种具有不同函数名称的更通用的方法(参见 cmets)是:

    def value?
      value.upcase == 'Y'
    end
    

    【讨论】:

    • 我认为has_condition? 可能是一个更好的函数名称,因为type 可能并不总是diabetic
    • has_x? 不是一个很好的命名约定,除非它实际上表示某种所有权。 the style guide
    • 为什么不叫它true?
    • @RobinDaugherty 所以它类似于has_diabetes?。重新考虑添加这个...
    • has_diabetes? 在不同的模型上会有意义,比如Person(我认为在这种情况下它符合样式指南)。但在这个模型中,坚持现有的命名转换并称之为value?会更有意义。
    【解决方案2】:

    您的问题不清楚,但您似乎正在使用 ActiveRecord。

    如果您能够更改数据库的结构,我建议您这样做。将布尔值存储为字符串不是一个好习惯。

    boolean 列类型将存储本机布尔值 if the database supports it, and will translate if not。 ActiveRecord 会自动为您的模型添加谓词方法。

    因此,如果您有一个名为value 的布尔列,那么还有一个名为value? 的方法将返回真或假。 “Automagical ?-methods for boolean attributes in ActiveRecord”是另一个例子。

    【讨论】:

      【解决方案3】:
      {"Y" => true, "N" => false}[health.value.upcase]
      

      【讨论】:

      • 虽然这可行,但它会受到可读性的影响。将值与'Y' 进行简单比较会更容易阅读--> 理解--> 维护。
      • 这很聪明。这不是恭维。 (health.value.upcase == "Y") 会更清晰简洁。
      • 我认为不进行简单比较的唯一原因是,是否有理由处理“y”或“n”以外的情况。但看起来用例只是“Y”、“N”,所以这有点过度设计了。
      猜你喜欢
      • 1970-01-01
      • 2019-03-17
      • 2011-07-31
      • 2013-06-22
      • 2020-01-10
      • 2021-12-24
      • 2017-07-28
      • 2010-11-08
      • 1970-01-01
      相关资源
      最近更新 更多