diff --git a/app/routes/application.js b/app/routes/application.js index 4b9f63f..ee9b050 100644 --- a/app/routes/application.js +++ b/app/routes/application.js @@ -86,6 +86,16 @@ export default class ApplicationRoute extends Route { }, ], }, + { + id: 'models', + subsections: [ + { + id: 'model-definition', + classicFiles: ['old.js'], + octaneFiles: ['new.js'], + }, + ], + }, ]; } } diff --git a/snippets/models/model-definition/new.js b/snippets/models/model-definition/new.js new file mode 100644 index 0000000..71c79de --- /dev/null +++ b/snippets/models/model-definition/new.js @@ -0,0 +1,70 @@ +import { withDefaults } from '@warp-drive/schema-record'; + +// Register schemas for all resources at once +store.schema.registerResources([ + // User schema + withDefaults({ + type: 'user', + fields: [ + { kind: 'field', name: 'firstName' }, + { kind: 'field', name: 'lastName' }, + { + kind: 'derived', + name: 'name', + type: 'concat', + options: { fields: ['firstName', 'lastName'], separator: ' ' } + }, + { + kind: 'hasMany', + name: 'pets', + type: 'pet', + options: { + async: false, + inverse: 'owner', + polymorphic: true, + linksMode: true, + resetOnRemoteUpdate: false, + } + } + ] + }), + + // Pet schema + withDefaults({ + type: 'pet', + fields: [ + { kind: 'field', name: 'name' }, + { + kind: 'belongsTo', + name: 'owner', + type: 'user', + options: { + async: false, + inverse: 'pets', + linksMode: true, + resetOnRemoteUpdate: false, + } + } + ] + }), + + // Dog schema (extends pet) + withDefaults({ + type: 'dog', + fields: [ + { kind: 'field', name: 'breed' }, + { + kind: 'belongsTo', + name: 'owner', + type: 'user', + options: { + async: false, + inverse: 'pets', + as: 'pet', + linksMode: true, + resetOnRemoteUpdate: false, + } + } + ] + }) +]); \ No newline at end of file diff --git a/snippets/models/model-definition/old.js b/snippets/models/model-definition/old.js new file mode 100644 index 0000000..b8221e5 --- /dev/null +++ b/snippets/models/model-definition/old.js @@ -0,0 +1,23 @@ +// Traditional EmberData Model Definition +import Model, { attr, hasMany, belongsTo } from '@ember-data/model'; + +export default class UserModel extends Model { + @attr('string') firstName; + @attr('string') lastName; + @hasMany('pet', { polymorphic: true, inverse: 'owner' }) pets; + + get name() { + return `${this.firstName} ${this.lastName}`; + } +} + +// Related models would be defined in separate files: + +// export default class PetModel extends Model { +// @attr('string') name; +// @belongsTo('user', { inverse: 'pets' }) owner; +// } + +// export default class DogModel extends PetModel { +// @attr('string') breed; +// } \ No newline at end of file diff --git a/translations/models/en-us.yaml b/translations/models/en-us.yaml new file mode 100644 index 0000000..e3beff5 --- /dev/null +++ b/translations/models/en-us.yaml @@ -0,0 +1,2 @@ +title: Models +description: See how traditional EmberData models compare to the new SchemaRecord approach. \ No newline at end of file diff --git a/translations/models/model-definition/en-us.yaml b/translations/models/model-definition/en-us.yaml new file mode 100644 index 0000000..ef40beb --- /dev/null +++ b/translations/models/model-definition/en-us.yaml @@ -0,0 +1,2 @@ +title: Model Definition +description: See how to define resources using the traditional EmberData models and the new SchemaRecord approach. \ No newline at end of file