golangのデータベースライブラリとしてgormパッケージを使用しています。私は "ホスト"や "注文"のような多くのデータベーステーブルを持っています。私のCRUDアプリケーションでは、すべてのコントローラはsetHost/setOrder関数を持っています....Gormで重複したコードを削除する方法
私はこのコントローラごとにこの関数を書くことができます。しかし、より良い方法は、最初のparamを使ってパラメータと同じクラスのオブジェクトを作成し、それをgormに渡してデータベースのデータで満たしてから返すという単一の関数を持つことです。私はそれを反映させようとしましたが失敗しました。なぜなら、おそらくそれはあまり理解していないからです。
多分、私はちょうどgormライブラリのいくつかの機能を発見していないか、または反射パッケージを適切に使用できません。 set関数をどのように実装すればよいですか?これを実装することは可能ですか、それとも私のコードを繰り返すべきですか?
type Host struct {
gorm.Model
name string
}
type Order struct {
gorm.Model
RoomSize int
}
func setOrder(c *gin.Context) (order models.Order) {
db := dbpkg.DBInstance(c)
id := new(ApplicationController).extractID(c)
db.First(&order, id)
if order.ID != id {
log.Panicf("No Object with the ID: %d", id)
}
return
}
func setHost(c *gin.Context) (host models.Host) {
db := dbpkg.DBInstance(c)
id := new(ApplicationController).extractID(c)
db.First(&host, id)
if host.ID != id {
log.Panicf("No Object with the ID: %d", id)
}
return host
}
func (ctrl ApplicationController) extractID(c *gin.Context) uint64 {
id, err := strconv.ParseUint(c.Params.ByName("id"), 10, 64)
if err != nil {
log.Panicf("ID: %s can not parse to an uint64", c.Params.ByName("id"))
}
return id
}