Перечисления Rails: строка или целочисленный столбец?

#mysql #ruby-on-rails-3 #gem #enumeration

#mysql #ruby-on-rails-3 #драгоценный камень #перечисление

Вопрос:

В настоящее время я ищу подходящий Rails gem для перечислений.

Я уже пробовал

  • enum_simulator
  • has_enum
    1. Оба используют столбец string в базе данных для хранения данных enum. Разве целочисленный столбец не будет иметь лучшую производительность или меньшее потребление памяти (при использовании MySQL)?
    2. Есть ли gem, который уже может это сделать?

Большое спасибо!

Обновление: я нашел драгоценный камень simple_enum, который использует целочисленные значения для представления перечисления в базе данных. Он поддерживает rails 3.1 и находится в хорошем состоянии.

Ответ №1:

Ruby Toolbox — ваш друг. https://www.ruby-toolbox.com/categories/Active_Record_Enumerations

Я использовал enumerated_attribute как с Rails 2.3, так и с Rails 3 с хорошими результатами. Да, он использует столбец string.

Строковые столбцы IMO лучше, чем целочисленные столбцы, потому что они не подразумевают никакого порядка значений и облегчают понимание атрибута (обратный инжиниринг, если хотите), не глядя на исходный код. И обычно разница в производительности незначительна, особенно если у вас есть индекс в поле — и вы должны.

Использование поля MySQL enum оказалось сложным в Rails 2.3, проблемы со схемами, не уверен, сохраняется ли оно в Rails 3.

Комментарии:

1. Большое спасибо! я посмотрю на это. Знаете ли вы, сжимает ли MYSQL данные строкового столбца, если в перечислении много избыточных значений?

2. @alex, я так не думаю, потому что enum это то, для чего нужно. Кстати, не забудьте проголосовать.

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

4. Я могу подтвердить, что MySQL enum по-прежнему не поддерживается в Rails 3

Ответ №2:

Ищите этот драгоценный камень: enumerate_it . Я думаю, это решает вашу проблему!