Rails 中的布尔值不是 "read"
Boolean values not being "read" in Rails
我使用 Roo 从 Excel 导入了一些值到我的 Rails 应用程序的布尔字段中。
在 Rails 控制台中,看起来一切正常,但在我的 Rails 应用程序中,Rails 似乎无法读取布尔值。
我有一个 DataPoint 模型。 DataPoint 的一个属性是布尔字段 currently_employed.
在 Rails 控制台中它是这样工作的(看起来不错):
003:0 > x.currently_employed
=> true
004:0 > z.currently_employed
=> false
005:0 > x.currently_employed == false
=> false
006:0 > x.currently_employed == "true"
=> false
007:0 > x.currently_employed == true
=> true
008:0 > z.currently_employed == false
=> true
009:0 > z.currently_employed == "false"
=> false
010:0 > z.currently_employed == true
=> false
鉴于控制台中的一切看起来都不错,我认为我的 data_point.rb 模型中的这个公式可以正常工作:
def self.pct_true(data_points)
true_count = 0
data_points.each do |x|
if x.currently_employed
true_count += 1
else
end
end
return true_count / data_points.count * 100
end
但它 returns 值为零,即使我有多个数据点实例,其中 x.currently_employed 在 Rails 控制台中计算为真。
有趣的是,当我将布尔字段 "currently_employed" 更改为整数字段 "annual_income" 时,这个相同的函数会计算每个实例并且 returns 值为 100。
鉴于上面的 Rails 控制台结果,知道我的模型中的方法可能有什么问题吗?
谢谢!
你的问题只是整数除法 - 看看:
[1] pry(main)> 1 / 100
=> 0
[2] pry(main)> 20 / 100
=> 0
快速修复可能是:
return true_count / data_points.count.to_f * 100
你用一个整数除以一个整数,所以你不能得到小数值。因为您将 true_count 除以 TOTAL 计数,所以该除法将始终为 0,除非每个 data_point.currently_employed 都为真。因此,您唯一可能的结果是 0 * 100 (0) 或 1 * 100 (100),而 100 将非常罕见。
你可以这样修复:
return true_count.to_f / data_points.count.to_f * 100
这会将您的整数转换为浮点数(本质上是小数),并允许除法。
不相关的注释
您的代码:
if x.currently_employed
true_count += 1
else
end
可以重构为:
true_count += 1 if x.currently_employed
如上所述,这是一个整数除法相关的问题
不相关的注释:
true_count = data_points.select {|data_point| data_point.currently_employed }.size
我使用 Roo 从 Excel 导入了一些值到我的 Rails 应用程序的布尔字段中。
在 Rails 控制台中,看起来一切正常,但在我的 Rails 应用程序中,Rails 似乎无法读取布尔值。
我有一个 DataPoint 模型。 DataPoint 的一个属性是布尔字段 currently_employed.
在 Rails 控制台中它是这样工作的(看起来不错):
003:0 > x.currently_employed
=> true
004:0 > z.currently_employed
=> false
005:0 > x.currently_employed == false
=> false
006:0 > x.currently_employed == "true"
=> false
007:0 > x.currently_employed == true
=> true
008:0 > z.currently_employed == false
=> true
009:0 > z.currently_employed == "false"
=> false
010:0 > z.currently_employed == true
=> false
鉴于控制台中的一切看起来都不错,我认为我的 data_point.rb 模型中的这个公式可以正常工作:
def self.pct_true(data_points)
true_count = 0
data_points.each do |x|
if x.currently_employed
true_count += 1
else
end
end
return true_count / data_points.count * 100
end
但它 returns 值为零,即使我有多个数据点实例,其中 x.currently_employed 在 Rails 控制台中计算为真。
有趣的是,当我将布尔字段 "currently_employed" 更改为整数字段 "annual_income" 时,这个相同的函数会计算每个实例并且 returns 值为 100。
鉴于上面的 Rails 控制台结果,知道我的模型中的方法可能有什么问题吗?
谢谢!
你的问题只是整数除法 - 看看:
[1] pry(main)> 1 / 100
=> 0
[2] pry(main)> 20 / 100
=> 0
快速修复可能是:
return true_count / data_points.count.to_f * 100
你用一个整数除以一个整数,所以你不能得到小数值。因为您将 true_count 除以 TOTAL 计数,所以该除法将始终为 0,除非每个 data_point.currently_employed 都为真。因此,您唯一可能的结果是 0 * 100 (0) 或 1 * 100 (100),而 100 将非常罕见。
你可以这样修复:
return true_count.to_f / data_points.count.to_f * 100
这会将您的整数转换为浮点数(本质上是小数),并允许除法。
不相关的注释
您的代码:
if x.currently_employed
true_count += 1
else
end
可以重构为:
true_count += 1 if x.currently_employed
如上所述,这是一个整数除法相关的问题
不相关的注释:
true_count = data_points.select {|data_point| data_point.currently_employed }.size