Может ли RoR работать с полями char (1) как с логическими полями? - PullRequest
0 голосов
/ 06 февраля 2009

Я смотрю на использование Ruby on Rails для витрины магазина, которая должна использовать существующие данные, но я могу создать свою собственную схему базы данных, если потребуется. Многие поля в существующих данных являются char (1), эмулирующими логическое поле (т. Е. Y / N) для кросс-платформенной переносимости. Поскольку данные подвержены изменениям, мне не нужно менять существующую структуру и преобразовывать эти поля в битовые / логические поля.

Если я использую Rails, я действительно хотел бы использовать красивый логический синтаксис Ruby и сказать что-то вроде <%= image_tag 'recycled.jpg' if product.recycled? %>, но будет ли Rails распознавать char (1) как логическое значение, или мне придется самому определять эти методы в модель как:

class Product < ActiveRecord::Base
  # ... other stuff here
  def recycled?
    self.recycled == 'Y'
  end
end

Я думаю, мне придется переопределить их самому, что не составляет особого труда, я просто хочу убедиться, что использование char (1), так как значения yes / no - это не то, что я использовал в прошлом.

Ответы [ 3 ]

1 голос
/ 06 февраля 2009

Я бы, вероятно, атаковал его на уровне модели - когда вы загружаете строку в экземпляр модели, вычисляете логический атрибут на основе символа. Добавьте метод получения для виртуального атрибута, который возвращает это значение, и метод установки, который обновляет как логическое значение, так и базовый символ.

1 голос
/ 06 февраля 2009

Насколько я знаю, то, что вы описываете, невозможно с ActiveRecord из коробки.

Однако, если у вас много подобных столбцов, вы можете посмотреть на метапрограммирование, чтобы обеспечить декларативный способ добавления соответствующей логики доступа. Что-то вроде: -

class Product < ActiveRecord::Base

  yes_no_accessor :recycled

end

Другая возможность - сделать обезьяну-патч ActiveRecord. Я думаю, что соответствующий метод ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value). Вы можете попробовать переопределить константу ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES, чтобы включить 'Y'. Я на самом деле не пробовал это!

0 голосов
/ 06 февраля 2009

Разве вы не можете просто обернуть его в свой движок базы данных с помощью представления или хранимой процедуры, чтобы создать согласованный интерфейс для вашего приложения?

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