Вывод значения TrueClass / FalseClass в целое число или строку / - PullRequest
6 голосов
/ 26 марта 2010

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

Вот дилемма: У меня есть логическое поле в моем приложении rails - оно явно хранится как Tinyint в MySQL. Однако - мне нужно сгенерировать xml на основе данных в mysql и отправить их клиенту - там сервис SOAP требует, чтобы у рассматриваемого поля было 0 или 1 в качестве значения этого поля. Поэтому во время генерации xml мне нужно преобразовать мой False в 0 и мой True в 1 (как они хранятся в БД). Поскольку в True & False отсутствует метод to_i, я мог бы написать оператор if, который генерирует 1 или 0 в зависимости от состояния true / false. Тем не менее, у меня есть около 10 таких индикаторов и создание и если / иначе для каждого не очень сухой. Так что вы рекомендуете мне делать?

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

Ответы [ 5 ]

5 голосов
/ 27 февраля 2015

Расширение TrueClass и FalseClass с humanize и to_i.

Это встречается в большинстве моих проектов, поэтому я использую инициализатор (если вы используете 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
5 голосов
/ 26 марта 2010

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

require 'boolean_ints'

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

3 голосов
/ 26 марта 2010

Вы можете просто установить обезьяны TrueClass и FalseClass в своем приложении рядом с этой конкретной моделью: любая реализация 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

Но чтобы избежать мартышек, есть ли какая-то причина, по которой вы не могли просто использовать троичный оператор? Если вам все еще недостаточно СУХОГО, заверните его одним из методов.

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
2 голосов
/ 14 декабря 2011

Обновление: это «решение» опасно и не должно использоваться!

Вы также можете попробовать:

value.object_id / 2

Я не уверен, насколько хорошо это работает в разных реализациях.

Чтобы избавиться от дублирования необходимости повторять это 10 раз, я все равно рекомендую создать метод:

def boolean_to_i value
  value.object_id / 2
end

Хотя на самом деле нет необходимости в патчах для обезьян.

0 голосов
/ 17 марта 2016

Вы можете использовать:

5 - bool.to_s.length

Это всегда будет работать, потому что true.to_s равно "true", false.to_s равно "false", "true".length равно 4, а "false".length равно 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...