Значение вывода TrueClass / FalseClass к целому числу или строке /

Я пытаюсь выяснить, существует ли простой способ сделать следующее за исключением добавления to_i метод к TrueClass/FalseClass.

Вот дилемма: у Меня есть булево поле в моем приложении для направляющих - который, очевидно, хранится как Tinyint в mysql. Однако - я должен генерировать xml, базирующийся данных в mysql, и отправить его клиенту - туда, сервис SOAP требует, чтобы рассматриваемое поле имело 0 или 1 как значение этого поля. Таким образом во время xml поколения я должен преобразовать свою Ложь в 0 и свое Истинное для 1 (который является, как они хранятся в DB). Начиная с Истинного и Ложного отсутствия to_i метод я мог записать некоторым, если оператор, которые генерируют или 1 или 0 в зависимости от истинного/ложного состояния. Однако у меня есть приблизительно 10 из этих индикаторов и создания и если/еще для каждого не очень DRY. Таким образом, что Вы рекомендуете, чтобы я сделал?

Или я мог добавить to_i метод к Истинному / Ложный класс. Но я не уверен, где я должен определить объем его в своем приложении для направляющих? Только в этой конкретной модели или где-то в другом месте?

6
задан konung 26 March 2010 в 16:12
поделиться

2 ответа

Вы можете создать файл, такой как lib / boolean_ints.rb , и обезьяна исправить метод to_i для TrueClass и FalseClass , как вы предложили. Затем в моделях или контроллерах, в которых вам нужно использовать метод to_i , вы можете просто поместить

require 'boolean_ints'

вверху, и они будут доступны для использования.

5
ответ дан 8 December 2019 в 16:00
поделиться

Вы можете просто исправить 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
3
ответ дан 8 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: