我想弄清楚是否有一种简单的方法可以做到以下简单的方法,将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应用程序中将它放在哪里?只是在这个特定的模型或其他地方?
答案 0 :(得分:5)
根据您的建议,您可以创建lib/boolean_ints.rb
和to_i
方法的TrueClass
方法等文件到FalseClass
和to_i
。然后,在需要使用require 'boolean_ints'
方法的模型或控制器中,您可以放置
{{1}}
在顶部,它们可供使用。
答案 1 :(得分:5)
humanize
和to_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)
您可以在您的应用中,在该特定模型附近对TrueClass
和FalseClass
进行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。