| 145 | } |
| 146 | |
| 147 | func (schema *Schema) setRelation(relation *Relationship) { |
| 148 | schema.Relationships.Mux.Lock() |
| 149 | defer schema.Relationships.Mux.Unlock() |
| 150 | |
| 151 | // set non-embedded relation |
| 152 | if rel := schema.Relationships.Relations[relation.Name]; rel != nil { |
| 153 | if len(rel.Field.BindNames) > 1 { |
| 154 | schema.Relationships.Relations[relation.Name] = relation |
| 155 | } |
| 156 | } else { |
| 157 | schema.Relationships.Relations[relation.Name] = relation |
| 158 | } |
| 159 | |
| 160 | // set embedded relation |
| 161 | if len(relation.Field.EmbeddedBindNames) <= 1 { |
| 162 | return |
| 163 | } |
| 164 | relationships := &schema.Relationships |
| 165 | for i, name := range relation.Field.EmbeddedBindNames { |
| 166 | if i < len(relation.Field.EmbeddedBindNames)-1 { |
| 167 | if relationships.EmbeddedRelations == nil { |
| 168 | relationships.EmbeddedRelations = map[string]*Relationships{} |
| 169 | } |
| 170 | if r := relationships.EmbeddedRelations[name]; r == nil { |
| 171 | relationships.EmbeddedRelations[name] = &Relationships{} |
| 172 | } |
| 173 | relationships = relationships.EmbeddedRelations[name] |
| 174 | } else { |
| 175 | if relationships.Relations == nil { |
| 176 | relationships.Relations = map[string]*Relationship{} |
| 177 | } |
| 178 | relationships.Relations[relation.Name] = relation |
| 179 | } |
| 180 | } |
| 181 | } |
| 182 | |
| 183 | // User has many Toys, its `Polymorphic` is `Owner`, Pet has one Toy, its `Polymorphic` is `Owner` |
| 184 | // |