Я пытаюсь выяснить, существует ли простой способ сделать следующее за исключением добавления to_i метод к TrueClass/FalseClass.
Вот дилемма: у Меня есть булево поле в моем приложении для направляющих - который, очевидно, хранится как Tinyint в mysql. Однако - я должен генерировать xml, базирующийся данных в mysql, и отправить его клиенту - туда, сервис SOAP требует, чтобы рассматриваемое поле имело 0 или 1 как значение этого поля. Таким образом во время xml поколения я должен преобразовать свою Ложь в 0 и свое Истинное для 1 (который является, как они хранятся в DB). Начиная с Истинного и Ложного отсутствия to_i метод я мог записать некоторым, если оператор, которые генерируют или 1 или 0 в зависимости от истинного/ложного состояния. Однако у меня есть приблизительно 10 из этих индикаторов и создания и если/еще для каждого не очень DRY. Таким образом, что Вы рекомендуете, чтобы я сделал?
Или я мог добавить to_i метод к Истинному / Ложный класс. Но я не уверен, где я должен определить объем его в своем приложении для направляющих? Только в этой конкретной модели или где-то в другом месте?
Вы можете создать файл, такой как lib / boolean_ints.rb
, и обезьяна исправить метод to_i
для TrueClass
и FalseClass
, как вы предложили. Затем в моделях или контроллерах, в которых вам нужно использовать метод to_i
, вы можете просто поместить
require 'boolean_ints'
вверху, и они будут доступны для использования.
Вы можете просто исправить TrueClass
и FalseClass
в своем приложении рядом с этой конкретной моделью: любая реализация to_i
при истинном и ложном, вероятно, будут одинаковыми.
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
Но есть ли причина, по которой вы не можете просто использовать тернарный оператор, чтобы избежать исправления обезьян? Если это все еще недостаточно СУХОЕ для вас, заверните его в метод.
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