1

我使用 Roo 从 Excel 中将一些值导入到我的 Rails 应用程序的布尔字段中。

在 Rails 控制台中,看起来一切正常,但在我的 Rails 应用程序中,Rails 似乎没有读取布尔值。

我有一个 DataPoint 模型。DataPoint 的一个属性是当前使用的布尔字段。

在 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

但它返回值为零,即使我有多个 DataPoint 实例,其中 x.currently_employed 在 Rails 控制台中的计算结果为 true。

有趣的是,当我将布尔字段“currently_employees”更改为整数字段“annual_income”时,这个相同的函数计算每个实例并返回值 100。

鉴于上面的 Rails 控制台结果,知道我的模型中的方法可能有什么问题吗?

谢谢!

4

3 回答 3

3

您的问题只是整数除法 - 看看:

[1] pry(main)> 1 / 100
=> 0
[2] pry(main)> 20 / 100
=> 0

一个快速的解决方法可能是:

return true_count / data_points.count.to_f * 100
于 2015-06-04T15:16:18.737 回答
1

您将整数除以整数,因此无法获得十进制值。因为您将 true_count 除以 TOTAL 计数,所以除非 EVERY data_point.currently_employed 为真,否则该除法将始终为 0。因此,您唯一可能的结果是 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
于 2015-06-04T15:16:20.857 回答
0

如上所述,这是一个与整数除法相关的问题

 不相关的注释:

true_count = data_points.select {|data_point| data_point.currently_employed }.size
于 2015-06-04T15:28:04.587 回答