0

私はこのようなモデルを持っています:

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

複数のタイプの通知 (電子メールおよび/または SMS) を指定する必要があり、ユーザーが必要な通知を指定できるようにするまで、問題なく動作していました。したがって、データベースの設定テーブルを見ると、実行可能だと思いました。

+----------------------+------------+------+-----+---------+----------------+
| 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 は SMS のみ、3 は SMS と電子メールの両方を意味します。データベースではすべてうまく機能していましたが、スクリプト/コンソールで試してみました。そうすることは不可能であることに気付きました(ブールフィールドのビットマスキング)。

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か?

4

1 に答える 1

1

Boolean データ型は TINYINT(1) として表されるため、バイトです。フィールドsend_notificationが bool として使用された場合、'0' - false、'1' - 'true' または NULL 値が存在する必要があります。値が 1 より大きい場合は、'1' で変更できます -

UPDATE settings SET send_notification = 1 WHERE send_notification > 1;

これで、このフィールドをフラグ (NULL、0、1、2...) に使用できます。必要に応じて、テーブルを変更して TINYINT を他の整数型に変更できます。

また、MySQL には便利なBIT 関数があります。

于 2011-04-18T07:01:14.397 に答える