如何在没有db:migrate的情况下将活动记录列类型从布尔值更改为整数?

时间:2011-04-18 06:33:43

标签: mysql ruby-on-rails activerecord boolean dbmigrate

我有一个这样的模型:

  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 个答案:

答案 0 :(得分:1)

布尔数据类型表示为TINYINT(1),因此它是一个字节。如果字段send_notification用作bool,则应该为'0' - false,'1' - 'true'或NULL值。如果有valuse&gt; 1,可以用'1'改变它们 -

UPDATE settings SET send_notification = 1 WHERE send_notification > 1;

现在,您可以将此字段用于标志(NULL,0,1,2 ......)。如果需要,可以更改表以将TINYINT更改为其他整数类型。

此外,MySQL有用BIT functions