gormでiotaな型をモデルのフィールド値にしたい時
iotaのままモデルに突っ込めると定数で分岐できたり、変化球が突っ込まれることがなくなるのでiotaされている型をフィールドに定義したかった。
結論
iotaな型はゼロ値がnilとして扱われるので、gormのタグオプションのnot null
を指定してあげて、ゼロ値をnilでなく、0とさせる。またはiotaのスタートを1などにしてあげる。
↓1はじめ
type Gender int
const (
// Male is man
Male Gender = 1 + iota // 1
// Female is woman
Female // 2
)
gormエンティティ
user_info.go
// Gender is sex of human
type Gender int
const (
// Male is man
Male Gender = iota
// Female is woman
Female
)
type (
// Info is detailed user information.
UserInfo struct {
common.BaseEntity // 独自定義。各エンティティの共通項を抜き出したもの
// gormのタグオプション、not nullを指定すればok.
Gender Gender `gorm:"type:tinyint(1);not null"`
Birthday *time.Time `gorm:"type:datetime;default:null;"`
LeaveDate *time.Time `gorm:"type:datetime;default:null;index:idx_leaveDate"`
}
)
テーブル定義
user_infos.sql
-- mysql
CREATE TABLE `user_infos` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`deleted_at` datetime DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`gender` tinyint(1) NOT NULL,
`birthday` datetime DEFAULT NULL,
`leave_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_infos_deleted_at` (`deleted_at`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4;