pop icon indicating copy to clipboard operation
pop copied to clipboard

has_many_association bug

Open walijoy opened this issue 6 years ago • 2 comments

debug

runtime/debug.Stack(0x502c9dd, 0x2, 0xc000318838)
        /usr/local/Cellar/go/1.13.4/libexec/src/runtime/debug/stack.go:24 +0x9d
git.liebaopay.com/INA_financial/rpc_services/app/srv/workflow/services.(*Workflow).CreateNode.func1(0xc0002e12c0)
        /app/go/rpc_services/app/srv/workflow/services/node.go:30 +0xde
panic(0x4e53060, 0xc000400120)
        /usr/local/Cellar/go/1.13.4/libexec/src/runtime/panic.go:679 +0x1b2
reflect.valueInterface(0x0, 0x0, 0x0, 0x502ca01, 0x2, 0x0)
        /usr/local/Cellar/go/1.13.4/libexec/src/reflect/value.go:1008 +0x1a0
reflect.Value.Interface(...)
        /usr/local/Cellar/go/1.13.4/libexec/src/reflect/value.go:1003
github.com/gobuffalo/pop/associations.(*hasManyAssociation).AfterProcess(0xc0001460f0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /Users/chenjiang/go/pkg/mod/github.com/gobuffalo/[email protected]+incompatible/associations/has_many_association.go:133 +0x16c
github.com/gobuffalo/pop.(*Connection).Create.func1.1(0xbf6f0b7565401648, 0x1fecb0180)
        /Users/chenjiang/go/pkg/mod/github.com/gobuffalo/[email protected]+incompatible/executors.go:273 +0x36d

incompatible/associations/has_many_association.go:133 +0x16c

func (a *hasManyAssociation) AfterProcess() AssociationStatement {
	v := a.value
	if v.Kind() == reflect.Ptr {
		v = v.Elem()
	}

	belongingIDFieldName := "ID"

	ownerIDFieldName := "ID"
	ownerID := 
       reflect.Indirect(reflect.ValueOf(a.owner)).FieldByName(ownerIDFieldName).Interface()  <--

model

type WorkflowNode struct {
	Id         int64          `json:"id" db:"id"`   <----- not ID
	WorkflowId int64          `json:"workflow_id" db:"workflow_id"`
	Name       string         `json:"name" db:"name"`
	Reviewers  types.JSONText `json:"reviewers" db:"reviewers" `
	Data       string         `json:"data" db:"data" `
	Rules      types.JSONText `json:"rules" db:"rules" `
	CreatedAt  int64          `json:"created_at" db:"created_at"`
	UpdatedAt  int64          `json:"updated_at" db:"updated_at"`

        //This line of code causes bug
	FromNodeEdges []WorkflowEdges `has_many:"workflow_graphs" primary_key:"id" fk_id:"from_node_id"`
}

run

	node := models.WorkflowNode{
		Name:       in.Name,
		WorkflowId: in.WorkflowId,
		Data:       in.Data,
		Reviewers:  types.JSONText(string(reviewersJsonByte)),
		Rules:      types.JSONText(in.Rules),
	}

	err = p.Def().Create(&node)
	if err != nil {
		out.Code = proto.Code_fail
		out.Message = MessageSystemException
		return nil
	}

walijoy avatar Nov 25 '19 11:11 walijoy

Hello, I think mine is related too because I have the same error when trying to create (not eager create) a user that contains "has_many" association.

So every time I want to create something I have to allocate the associated as empty like:

user := &models.User{}

if err := c.Bind(user); err != nil {
	return c.Render(http.StatusBadRequest, r.HTML("auth/signup.html"))
}

user.Portals = &models.UserCompanies{} "<--- Without this I get the error @hookover shows"

if err := tx.Create(user); err != nil {
	return err
}

Is that the correct behavior?, I thought that when we want to create something with associations we should use "eager().Create(&model)"

dmuriel avatar Dec 03 '19 14:12 dmuriel

The ID field of this framework must be completely uppercase, otherwise problems will occur, including when querying a single record, the value of the ID field will be 0. like this:

type User struct {
Id int `db:"id"` //auto_increment
Name string `db:"name"`
}

u := &User{Name:"test"}
err :=pop.Create(u); 
err == nil
//fmt.print(u.Id, u.Name)   // 0, test  ,the id in database is a 1 or more

walijoy avatar Dec 07 '19 13:12 walijoy