【发布时间】: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
正在从 SQL 调用返回以下对象:
#<Health:0x007fc8533f2de8 @type=:diabetic, @value="N", @data_source=nil, @measured_at=nil>
该值可以是“Y”或“N”,可以通过health.value 访问。
如何将此值表示为布尔值?
【问题讨论】:
标签: ruby-on-rails ruby
如果Health 是一个模型,您可以执行以下操作:
def diabetic?
value.upcase == 'Y'
end
在模型文件中。
另一种具有不同函数名称的更通用的方法(参见 cmets)是:
def value?
value.upcase == 'Y'
end
【讨论】:
has_condition? 可能是一个更好的函数名称,因为type 可能并不总是diabetic
has_x? 不是一个很好的命名约定,除非它实际上表示某种所有权。 the style guide
true??
has_diabetes?。重新考虑添加这个...
has_diabetes? 在不同的模型上会有意义,比如Person(我认为在这种情况下它符合样式指南)。但在这个模型中,坚持现有的命名转换并称之为value?会更有意义。
您的问题不清楚,但您似乎正在使用 ActiveRecord。
如果您能够更改数据库的结构,我建议您这样做。将布尔值存储为字符串不是一个好习惯。
boolean 列类型将存储本机布尔值 if the database supports it, and will translate if not。 ActiveRecord 会自动为您的模型添加谓词方法。
因此,如果您有一个名为value 的布尔列,那么还有一个名为value? 的方法将返回真或假。 “Automagical ?-methods for boolean attributes in ActiveRecord”是另一个例子。
【讨论】:
{"Y" => true, "N" => false}[health.value.upcase]
【讨论】:
'Y' 进行简单比较会更容易阅读--> 理解--> 维护。
(health.value.upcase == "Y") 会更清晰简洁。