Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deprecate Non Strict Relationships #2093

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions guides/v5.0.0/models/customizing-serializers.md
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ have a model with a `hasMany` relationship:
import Model, { hasMany } from '@ember-data/model';

export default class PostModel extends Model {
@hasMany('comment', { async: true }) comments;
@hasMany('comment', { async: true, inverse: 'originalPost' }) comments;
}
```

Expand Down Expand Up @@ -401,7 +401,7 @@ a model:
import Model, { belongsTo } from '@ember-data/model';

export default class CommentModel extends Model {
@belongsTo('post') originalPost
@belongsTo('post', { async: true, inverse: 'comments' }) originalPost
}
```

Expand Down Expand Up @@ -713,8 +713,8 @@ import Model, { attr, hasMany } from '@ember-data/model';
export default class Post extends Model {
@attr('string') title;
@attr('string') tag;
@hasMany('comment', { async: false }) comments;
@hasMany('post') relatedPosts;
@hasMany('comment', { async: true, inverse: 'post' }) comments;
@hasMany('post', { async: true, inverse: 'relatedPosts' }) relatedPosts;
}
```

Expand Down
4 changes: 2 additions & 2 deletions guides/v5.0.0/models/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -238,15 +238,15 @@ example, an `order` may have many `line-items`, and a
import Model, { hasMany } from "@ember-data/model";

export default class OrderModel extends Model {
@hasMany("line-item") lineItems;
@hasMany("line-item", { async: false, inverse: 'order' }) lineItems;
}
```

```javascript {data-filename=app/models/line-item.js}
import Model, { belongsTo } from "@ember-data/model";

export default class LineItemModel extends Model {
@belongsTo("order") order;
@belongsTo("order", { async: false, inverse: 'lineItems' }) order;
}
```

Expand Down
59 changes: 22 additions & 37 deletions guides/v5.0.0/models/relationships.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ To declare a one-to-one relationship between two models, use
import Model, { belongsTo } from '@ember-data/model';

export default class UserModel extends Model {
@belongsTo('profile') profile;
@belongsTo('profile', { async: false, inverse: 'user' }) profile;
}
```

```javascript {data-filename=app/models/profile.js}
import Model, { belongsTo } from '@ember-data/model';

export default class ProfileModel extends Model {
@belongsTo('user') user;
@belongsTo('user', { async: false, inverse: 'profile' }) user;
}
```

Expand All @@ -31,15 +31,15 @@ To declare a one-to-many relationship between two models, use
import Model, { hasMany } from '@ember-data/model';

export default class BlogPostModel extends Model {
@hasMany('comment') comments;
@hasMany('comment', { async: false, inverse: 'blogPost' }) comments;
}
```

```javascript {data-filename=app/models/comment.js}
import Model, { belongsTo } from '@ember-data/model';

export default class CommentModel extends Model {
@belongsTo('blog-post') blogPost;
@belongsTo('blog-post', { async: false, inverse: 'comments' }) blogPost;
}
```

Expand All @@ -52,68 +52,53 @@ To declare a many-to-many relationship between two models, use
import Model, { hasMany } from '@ember-data/model';

export default class BlogPostModel extends Model {
@hasMany('tag') tags;
@hasMany('tag', { async: false, inverse: 'blogPosts' }) tags;
}
```

```javascript {data-filename=app/models/tag.js}
import Model, { hasMany } from '@ember-data/model';

export default class TagModel extends Model {
@hasMany('blog-post') blogPosts;
@hasMany('blog-post', { async: false, inverse: 'tags' }) blogPosts;
}
```

### Explicit Inverses
### No Inverse Relations

EmberData will do its best to discover which relationships map to one
another. In the one-to-many code above, for example, EmberData can figure out that
changing the `comments` relationship should update the `blogPost`
relationship on the inverse because `blogPost` is the only relationship to
that model.

However, sometimes you may have multiple `belongsTo`/`hasMany`s for
the same type. You can specify which property on the related model is
the inverse using `belongsTo` or `hasMany`'s `inverse`
option. Relationships without an inverse can be indicated as such by
including `{ inverse: null }`.
If an inverse relationship exists and you wish changes on one side
to reflect onto the other side, use the inverse key.
If you wish to not have changes reflected or
no inverse relationship exists, specify `{inverse: null }`.

```javascript {data-filename=app/models/comment.js}
import Model, { belongsTo } from '@ember-data/model';

export default class CommentModel extends Model {
@belongsTo('blog-post', { inverse: null }) onePost;
@belongsTo('blog-post') twoPost;
@belongsTo('blog-post') redPost;
@belongsTo('blog-post') bluePost;
@belongsTo('blog-post', { async: false, inverse: null }) blogPost;
}
```

```javascript {data-filename=app/models/blog-post.js}
import Model, { hasMany } from '@ember-data/model';

export default class BlogPostModel extends Model {
@hasMany('comment', {
inverse: 'redPost'
})
comments;
}
```

### Reflexive Relations

When you want to define a reflexive relation (a model that has a relationship to
itself), you must explicitly define the inverse relationship. If there
is no inverse relationship then you can set the inverse to `null`.
If you want to define a reflexive relation (a model that has a relationship to
itself), you can do it via specifying `inverse`.

Here's an example of a one-to-many reflexive relationship:

```javascript {data-filename=app/models/folder.js}
import Model, { belongsTo, hasMany } from '@ember-data/model';

export default class FolderModel extends Model {
@hasMany('folder', { inverse: 'parent' }) children;
@belongsTo('folder', { inverse: 'children' }) parent;
@hasMany('folder', { async: false, inverse: 'parent' }) children;
@belongsTo('folder', { async: false, inverse: 'children' }) parent;
}
```

Expand All @@ -124,7 +109,7 @@ import Model, { attr, belongsTo } from '@ember-data/model';

export default class UserModel extends Model {
@attr('string') name;
@belongsTo('user', { inverse: 'bestFriend' }) bestFriend;
@belongsTo('user', { async: false, inverse: 'bestFriend' }) bestFriend;
}
```

Expand All @@ -134,7 +119,7 @@ You can also define a reflexive relationship that doesn't have an inverse:
import Model, { belongsTo } from '@ember-data/model';

export default class FolderModel extends Model {
@belongsTo('folder', { inverse: null }) parent;
@belongsTo('folder', { async: false, inverse: null }) parent;
}
```

Expand All @@ -156,15 +141,15 @@ First, let's look at the model definitions:
import Model, { hasMany } from '@ember-data/model';

export default class UserModel extends Model {
@hasMany('payment-method', { polymorphic: true }) paymentMethods;
@hasMany('payment-method', { async: false, inverse: 'user', polymorphic: true }) paymentMethods;
}
```

```javascript {data-filename=app/models/payment-method.js}
import Model, { belongsTo } from '@ember-data/model';

export default class PaymentMethodModel extends Model {
@belongsTo('user', { inverse: 'paymentMethods' }) user;
@belongsTo('user', { async: false, inverse: 'paymentMethods' }) user;
}
```

Expand Down Expand Up @@ -277,15 +262,15 @@ Let's assume that we have a `blog-post` and a `comment` model. A single blog pos
import Model, { hasMany } from '@ember-data/model';

export default class BlogPostModel extends Model {
@hasMany('comment') comments;
@hasMany('comment', { async: false, inverse: 'blogPost' }) comments;
}
```

```javascript {data-filename=app/models/comment.js}
import Model, { belongsTo } from '@ember-data/model';

export default class CommentModel extends Model {
@belongsTo('blog-post') blogPost;
@belongsTo('blog-post', { async: false, inverse: 'comments' }) blogPost;
}
```

Expand Down
2 changes: 1 addition & 1 deletion guides/v5.0.0/testing/testing-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export default class ProfileModel extends Model {}
import Model, { belongsTo } from '@ember-data/model';

export default class UserModel extends Model {
@belongsTo('profile') profile;
@belongsTo('profile', { async: false, inverse: null }) profile;
}
```

Expand Down