2017-09-09 23 views
0

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 
} 

答えて

0

コントローラには、extractID機能を持つインターフェイスを実装してください。次に、コントローラーごとにextractIDを実装します。種類のこの例のように:

package main 

import "fmt" 

type IDInterface interface { 
    ExtractString() 
} 

type OrderController struct { 
    IDInterface 
    OrderData string 
} 

type HostController struct { 
    IDInterface 
    HostData string 
} 

func (c OrderController) ExtractString() { 
    fmt.Println("Data: " + c.OrderData) 
} 

func (c HostController) ExtractString() { 
    fmt.Println("Data: " + c.HostData) 
} 

func main() { 
    o := OrderController{OrderData: "I'm an order!"} 
    h := HostController{HostData: "I'm a host!"} 
    printData(o) 
    printData(h) 
} 

func printData(inter IDInterface) { 
    inter.ExtractString() 
} 

printDataIDInterfaceにかかりますが、mainに私は、コントローラを渡しています。

関連する問題