genmai.go
func (jc *JoinCondition) On(larg interface{}, args ...string) *Condition {
	var lcolumn string
	switch rv := reflect.ValueOf(larg); rv.Kind() {
	case reflect.String:
		lcolumn = rv.String()
	default:
		for rv.Kind() == reflect.Ptr {
			rv = rv.Elem()
		}
		if rv.Kind() != reflect.Struct {
			panic(fmt.Errorf("On: first argument must be string or struct, got %v", rv.Type()))
		}
		jc.leftTableName = jc.db.tableName(rv.Type())
		lcolumn, args = args[0], args[1:]
	}
	switch len(args) {
	case 0:
		jc.left, jc.op, jc.right = lcolumn, "=", lcolumn
	case 2:
		jc.left, jc.op, jc.right = lcolumn, args[0], args[1]
	default:
		panic(fmt.Errorf("On: arguments expect 1 or 3, got %v", len(args)+1))
	}
	c := newCondition(jc.db)
	c.parts = append(c.parts, part{
		clause:   jc.clause,
		expr:     jc,
		priority: -100,
	})
	return c
}
func (jc *JoinCondition) On(larg interface{}, args ...string) *Condition {
	var lcolumn string
	switch rv := reflect.ValueOf(larg); rv.Kind() {
	case reflect.String:
		lcolumn = rv.String()
	default:
		for rv.Kind() == reflect.Ptr {
			rv = rv.Elem()
		}
		if rv.Kind() != reflect.Struct {
			panic(fmt.Errorf("On: first argument must be string or struct, got %v", rv.Type()))
		}
		jc.leftTableName = jc.db.tableName(rv.Type())
		lcolumn, args = args[0], args[1:]
	}
	switch len(args) {
	case 0:
		jc.left, jc.op, jc.right = lcolumn, "=", lcolumn
	case 2:
		jc.left, jc.op, jc.right = lcolumn, args[0], args[1]
	default:
		panic(fmt.Errorf("On: arguments expect 1 or 3, got %v", len(args)+1))
	}
	c := newCondition(jc.db)
	c.parts = append(c.parts, part{
		clause:   jc.clause,
		expr:     jc,
		priority: -100,
	})
	return c
}
// On adds "[LEFT] JOIN ... ON" clause to the Condition and returns it for method chain.