go
1func findByString(name string) func(db *gorm.DB) *gorm.DB {
2 return func(db *gorm.DB) *gorm.DB {
3 if name == "" {
4 return db
5 }
6 return db.Where("name = ?", name)
7 }
8}
この関数は、引数が空であれば gorm の DB をそのまま返す関数を、引数が空で無ければ where 句を設定した DB を返す関数を、返す関数です。なぜこの様な関数を作っているのかというと、gorm.Scopes という関数に渡す為です。
https://godoc.org/github.com/jinzhu/gorm#DB.Scopes
この Scope は、gorm の各種フック関数 Scopes や BeforeSave/BeforeCreate に関数を渡す事で、動的に条件などを付与する仕組みです。
ドキュメントから引用します。
go
1func AmountGreaterThan1000(db *gorm.DB) *gorm.DB {
2 return db.Where("amount > ?", 1000)
3}
4
5func OrderStatus(status []string) func (db *gorm.DB) *gorm.DB {
6 return func (db *gorm.DB) *gorm.DB {
7 return db.Scopes(AmountGreaterThan1000).Where("status in (?)", status)
8 }
9}
10
11db.Scopes(AmountGreaterThan1000, OrderStatus([]string{"paid", "shipped"})).Find(&orders)
この OrderStatus は AmountGreaterThan1000 を使っていますが、もしこの Scopes の仕組みが無かった場合、同じ db.Where というコードを OrderStatus に入れないといけなくなりますよね。
また色々な所で AmountGreaterThan1000 や OrderStatus といった条件付けを行う場合、出来れば再利用したいですよね。そういった場合にこの Scopes が使われます。
gorm 側からすると、スコープを絞る為にコードを呼び出してあげるから、ユーザの特定の処理を関数として渡しなさいという作りになるはずです。gorm はメソッドチェインで書くスタイルなので、findByString であれば
go
1db.Scopes(findByString("something"))
と書くだけで Where 句が指定できるという仕組みなのです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/12 15:06
退会済みユーザー
2017/11/12 15:08
2017/11/12 15:14 編集
2017/11/12 15:17
退会済みユーザー
2017/11/12 15:19