我有一个这样的模型:
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
之外,还有其他更好的解决方案吗?
答案 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。