布尔值不是"读"在Rails中

时间:2015-06-04 15:05:11

标签: ruby-on-rails ruby roo

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

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

我有一个DataPoint模型。 DataPoint的一个属性是current_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

鉴于Console中的一切似乎都很好看,我认为我的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。

有趣的是,当我更改布尔字段" current_employed"到整数字段" annual_income",这个相同的函数计算每个实例并返回值100.

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

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

快速解决方法可能是:

return true_count / data_points.count.to_f * 100

答案 1 :(得分:1)

您将整数除以整数,因此无法获得小数值。因为您将true_count除以TOTAL计数,所以除非每个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

答案 2 :(得分:0)

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

无关的说明:

true_count = data_points.select {|data_point| data_point.currently_employed }.size