将TrueClass / FalseClass的值输出为整数或字符串/

时间:2010-03-26 16:12:24

标签: ruby-on-rails ruby

我想弄清楚是否有一种简单的方法可以做到以下简单的方法,将to_i方法添加到TrueClass / FalseClass。

这是一个两难的问题: 我的rails应用程序中有一个布尔字段 - 显然在mysql中存储为Tinyint。但是 - 我需要根据mysql中的数据生成xml并将其发送给客户 - SOAP服务要求相关字段的0或1作为此字段的值。因此,在生成xml时,我需要将我的False转换为0,将我的True转换为1(这是它们存储在数据库中的方式)。自True&假缺少to_i方法我可以编写一些if语句,根据true / false状态生成1或0。但是,我有大约10个这些指标和创建,如果/其他每个不是很干。那你建议我做什么?

或者我可以在True / False类中添加to_i方法。但是我不知道我应该在rails应用程序中将它放在哪里?只是在这个特定的模型或其他地方?

5 个答案:

答案 0 :(得分:5)

根据您的建议,您可以创建lib/boolean_ints.rbto_i方法的TrueClass方法等文件到FalseClassto_i。然后,在需要使用require 'boolean_ints' 方法的模型或控制器中,您可以放置​​

{{1}}

在顶部,它们可供使用。

答案 1 :(得分:5)

使用humanizeto_i扩展TrueClass和FalseClass。

这出现在我的大部分项目中,所以我使用初始化器(如果你使用的是Rails),它将这两个有用的方法添加到每个类中,如下所示:

<强>配置/初始化/ true_and_false.rb

class TrueClass
  def humanize
    'Yes'
  end

  def to_i
    1
  end
end

class FalseClass
  def humanize
    'No'
  end

  def to_i
    0
  end
end

然后,它使“人类消费”“机器消费”非常容易呈现true

> true.humanize     #=> Yes
> true.to_i         #=> 1

> false.humanize    #=> No
> false.to_i        #=> 0

答案 2 :(得分:3)

您可以在您的应用中,在该特定模型附近对TrueClassFalseClass进行monkeypatch:to_i关于true和false的任何实现可能都是相同的。

irb(main):004:0> true.to_i
NoMethodError: undefined method `to_i' for true:TrueClass
        from (irb):4
irb(main):005:0> class TrueClass
irb(main):006:1>  def to_i
irb(main):007:2>   1
irb(main):008:2>  end
irb(main):009:1> end
=> nil
irb(main):010:0>
irb(main):011:0* true.to_i
=> 1

但是为了避免monkeypatching,有什么理由你不能只使用三元运算符?如果那仍然不够干,请将其包装在方法中。

irb(main):012:0> true ? 1 : 0
=> 1
irb(main):013:0> false ? 1 : 0
=> 0

当然,这也适用于非布尔变量:

irb(main):019:0* 1234 ? 1 : 0
=> 1
irb(main):020:0> nil ? 1 : 0
=> 0

答案 3 :(得分:2)

更新:此“解决方案”很危险,不应使用!

您也可以尝试:

value.object_id / 2

我不确定它在各种实现中的效果如何。

为了摆脱不得不重复10次的重复,我仍然建议创建一个方法:

def boolean_to_i value
  value.object_id / 2
end

不需要猴子补丁。

答案 4 :(得分:0)

您可以使用:

5 - bool.to_s.length

这始终有效,因为true.to_s"true"false.to_s"false""true".length为4,而"false".length为5。