MySQLのBIT型
Rails で MySQL の BIT型が扱えることを確認した。
要は String で渡ってくる。
DROP TABLE IF EXISTS `entries`; CREATE TABLE `entries` ( `id` int(11) NOT NULL, `flags` bit(8) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=ndbcluster DEFAULT CHARSET=sjis; INSERT INTO entries VALUES(1, b'00000111');
Ruby の世界ではこうなる:
$ ./script/console Loading development environment (Rails 2.1.0) >> entry = Entry.find 1 => #<Entry id: 1, flags: "\a"> >> entry.flags => "\a" >> entry.flags.class => String >> entry.flags.unpack("C8")[0] => 7 >> "%08b" % entry.flags.unpack("C8")[0] => "00000111" >> entry.flags.unpack("B8") => "00000111"
フラグの上げ下げは、モデルでビット毎に専用のアクセサを用意した方がいいだろう。
class Entry < ActiveRecord::Base def up_read self.flags = (self.flags.unpack("C8")[0] | 0b00000100).chr end def down_write self.flags = (self.flags.unpack("C8")[0] & 0b11111101).chr end end
ちょっと長いな。つーか pack/unpack はよーわからんから困る。
ビット演算なんてひさかたぶりすぐる。