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