Skip to content

Commit 122b7a5

Browse files
Add: comparison between EmberData models and SchemaRecord
1 parent b2a16bd commit 122b7a5

File tree

5 files changed

+101
-0
lines changed

5 files changed

+101
-0
lines changed

app/routes/application.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,16 @@ export default class ApplicationRoute extends Route {
8686
},
8787
],
8888
},
89+
{
90+
id: 'models',
91+
subsections: [
92+
{
93+
id: 'model-definition',
94+
classicFiles: ['old.js'],
95+
octaneFiles: ['new.js'],
96+
},
97+
],
98+
},
8999
];
90100
}
91101
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { withDefaults } from '@warp-drive/schema-record';
2+
3+
// Register schemas for all resources at once
4+
store.schema.registerResources([
5+
// User schema
6+
withDefaults({
7+
type: 'user',
8+
fields: [
9+
{ kind: 'field', name: 'firstName' },
10+
{ kind: 'field', name: 'lastName' },
11+
{
12+
kind: 'derived',
13+
name: 'name',
14+
type: 'concat',
15+
options: { fields: ['firstName', 'lastName'], separator: ' ' }
16+
},
17+
{
18+
kind: 'hasMany',
19+
name: 'pets',
20+
type: 'pet',
21+
options: {
22+
async: false,
23+
inverse: 'owner',
24+
polymorphic: true
25+
}
26+
}
27+
]
28+
}),
29+
30+
// Pet schema
31+
withDefaults({
32+
type: 'pet',
33+
fields: [
34+
{ kind: 'field', name: 'name' },
35+
{
36+
kind: 'belongsTo',
37+
name: 'owner',
38+
type: 'user',
39+
options: {
40+
async: false,
41+
inverse: 'pets'
42+
}
43+
}
44+
]
45+
}),
46+
47+
// Dog schema (extends pet)
48+
withDefaults({
49+
type: 'dog',
50+
fields: [
51+
{ kind: 'field', name: 'breed' },
52+
{
53+
kind: 'belongsTo',
54+
name: 'owner',
55+
type: 'user',
56+
options: {
57+
async: false,
58+
inverse: 'pets',
59+
as: 'pet'
60+
}
61+
}
62+
]
63+
})
64+
]);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Traditional EmberData Model Definition
2+
import Model, { attr, hasMany, belongsTo } from '@ember-data/model';
3+
4+
export default class UserModel extends Model {
5+
@attr('string') firstName;
6+
@attr('string') lastName;
7+
@hasMany('pet', { polymorphic: true, inverse: 'owner' }) pets;
8+
9+
get name() {
10+
return `${this.firstName} ${this.lastName}`;
11+
}
12+
}
13+
14+
// Related models would be defined in separate files:
15+
16+
// export default class PetModel extends Model {
17+
// @attr('string') name;
18+
// @belongsTo('user', { inverse: 'pets' }) owner;
19+
// }
20+
21+
// export default class DogModel extends PetModel {
22+
// @attr('string') breed;
23+
// }

translations/models/en-us.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
title: Models
2+
description: See how traditional EmberData models compare to the new SchemaRecord approach.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
title: Model Definition
2+
description: See how to define resources using the traditional EmberData models and the new SchemaRecord approach.

0 commit comments

Comments
 (0)