Open2

ent触ってみる

nabeyangnabeyang

Edges()を定義すると、こんなのが生成される。

// QueryTokens queries the tokens edge of a User.
func (c *UserClient) QueryTokens(u *User) *FitbitQuery {
	query := &FitbitQuery{config: c.config}
	query.path = func(ctx context.Context) (fromV *sql.Selector, _ error) {
		id := u.ID
		step := sqlgraph.NewStep(
			sqlgraph.From(user.Table, user.FieldID, id),
			sqlgraph.To(fitbit.Table, fitbit.FieldID),
			sqlgraph.Edge(sqlgraph.O2M, false, user.TokensTable, user.TokensColumn),
		)
		fromV = sqlgraph.Neighbors(u.driver.Dialect(), step)
		return fromV, nil
	}
	return query
}

QueryTokensuはconfigを保持してないとDialectでエラーになるんだけど、もしc.driver.Dialectだったらそんな必要ない。この後の処理を考えてもcからDialect取る方が良いような気がする。

nabeyangnabeyang

こんな感じでFieldsで指定したカラムを利用するとfitbit.UserIDEQが使えるようになるので、QueryTokens無しでトークン取得できるようになった。

func (Fitbit) Fields() []ent.Field {
	return []ent.Field{
		field.Int("user_id").Optional(),
...

// Edges of the Fitbit.
func (Fitbit) Edges() []ent.Edge {
	return []ent.Edge{
		edge.From("user", User.Type).
			Ref("tokens").
			Field("user_id").
			Unique(),
	}
}