Как изменить тип столбца активной записи с логического на целое без db: migrate? - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть такая модель:

  create_table :settings do |t|
    t.integer :user_id
    t.boolean :send_notification, :default => true
  end

Это работало хорошо, пока мне не нужно было указать несколько типов уведомлений (электронная почта и / или смс), и я хочу, чтобы пользователь мог указать, какое уведомление ему нужно. Поэтому я подумал, что это выполнимо, когда я смотрю на свою таблицу расчетов в базе данных:

+----------------------+------------+------+-----+---------+----------------+
| Field                | Type       | Null | Key | Default | Extra          |
+----------------------+------------+------+-----+---------+----------------+
| id                   | int(11)    | NO   | PRI | NULL    | auto_increment |
| user_id              | int(11)    | YES  | MUL | NULL    |                |
| send_notification    | tinyint(1) | YES  |     | 1       |                |
+----------------------+------------+------+-----+---------+----------------+

Итак, я подумал о повторном использовании столбца send_notification с битовой маскировкой, например 0 означает ничего, 1 означает только электронную почту, 2 означает только смс, а 3 означает как смс, так и электронную почту. В базе данных все работало хорошо, но когда я попробовал это в скрипте / консоли. Я понял, что это невозможно (битовая маскировка на логическом поле).

ree > setting = Setting.first
 => #<Setting id: 1, user_id: 1, send_notification: false> 
ree > setting.send_notification = 2
 => 2 
ree > setting
 => #<Setting id: 1, user_id: 1, send_notification: false> 

Так что мне нужно изменить тип столбца, но это немного дорого, так как моя таблица очень большая. Есть ли лучшее решение, кроме создания файла миграции и rake db:migrating?

1 Ответ

1 голос
/ 18 апреля 2011

Логический тип данных представлен как TINYINT (1), поэтому это байт.Если в качестве значения bool использовалось поле send_notification, должны быть значения «0» - false, «1» - «true» или NULL.Если есть valuse> 1, их можно изменить с помощью '1' -

UPDATE settings SET send_notification = 1 WHERE send_notification > 1;

Теперь вы можете использовать это поле для своих флагов (NULL, 0, 1, 2 ...).При желании вы можете изменить таблицу, чтобы изменить TINYINT на другой целочисленный тип.

Кроме того, MySQL имеет полезные функции BIT .

...