モデル

モデルはデータベースをラップし、リレーションシップを定義できます。

クラスメソッド vs インスタンスメソッド

以下に記載されているメソッドはモデルのインスタンスに適用されますが、通常はSchemaを使用してモデルのクラスにアクセスします。これはインスタンスを見つけたり作成したりするために使用できます。

クラスメソッドについては、Schema APIドキュメントで確認できます。

プロパティとリレーションシップへのアクセス

モデルから直接プロパティ(フィールド)とリレーションシップにアクセスできます。

user.name;    // 'Sam'
user.team;    // Team model
user.teamId;  // Team id (foreign key)

Mirageモデルは属性においてスキーマレスですが、リレーションシップスキーマは既知です。

例えば、

let user = schema.users.create();
user.attrs  // { }
user.name   // undefined

let user = schema.users.create({ name: 'Sam' });
user.attrs  // { name: 'Sam' }
user.name   // 'Sam'

ただし、userpostsリレーションシップが定義されている場合、

let user = schema.users.create();
user.posts  // returns an empty Posts Collection

プロパティ

関連付け: オブジェクト

このモデルの関連付けのハッシュを返します。

let server = new Server({
  models: {
    user: Model,
    post: Model.extend({
      user: belongsTo(),
      comments: hasMany()
    }),
    comment: Model
  },

  seeds(server) {
    let peter = server.create("user", { name: "Peter" });
    server.create("post", { user: peter });
  }
});

let post = server.schema.posts.find(1)
post.associations

// {
//   user: BelongsToAssociation,
//   comments: HasManyAssociation
// }

各関連付けで利用可能なフィールドを確認するには、Associationクラスのドキュメントを参照してください。

属性: 任意

モデルの属性を返します。

let post = schema.blogPosts.find(1);
post.attrs; // {id: 1, title: 'Lorem Ipsum', publishedAt: '2012-01-01 10:00:00'}

モデルから直接個々の属性にもアクセスできることに注意してください。例えば、post.titleなどです。

メソッド

削除(): 任意

DBレコードを削除します。

let post = blogPosts.find(1);
post.destroy(); // removed from the db

新規作成(): ブール値

ブール値。モデルがまだDBに永続化されていない場合はtrue。

let post = blogPosts.new({title: 'Lorem ipsum'});
post.isNew(); // true
post.id;      // null

post.save();  // true
post.isNew(); // false
post.id;      // 1

保存済み(): ブール値

ブール値。isNewの反対。

再読み込み(): 任意

データベースからモデルのデータを再読み込みします。

let post = blogPosts.find(1);
post.attrs;     // {id: 1, title: 'Lorem ipsum'}

post.title = 'Hipster ipsum';
post.title;     // 'Hipster ipsum';

post.reload();  // true
post.title;     // 'Lorem ipsum'

保存(): 任意

モデルを作成または保存します。

let post = blogPosts.new({ title: 'Lorem ipsum' });
post.id; // null

post.save();
post.id; // 1

post.title = 'Hipster ipsum'; // db has not been updated
post.save();                  // ...now the db is updated

toString(): 文字列

モデルとIDの簡単な文字列表現。

let post = blogPosts.find(1);
post.toString(); // "model:blogPost:1"

update(key: 文字列, val: 文字列): 任意

DB内のレコードを更新します。

let post = blogPosts.find(1);
post.update('title', 'Hipster ipsum'); // the db was updated
post.update({
  title: 'Lorem ipsum',
  created_at: 'before it was cool'
});