【Sails.js 入門 - 04】Models その2

http://sailsjs.org/#documentation/models

# Where do I define Models?

モデルは、Sailsアプリケーション内の <code>api/models/ directory</code> に定義される。モデルはコマンド・ラインで生成できる。

```
sails generate model Person
```

# Automatic schema creation

コンフィギュレーションによって、データベーステーブルは自動的に再作成させることができる。

# Querying Models

コントローラ、ビュー、サービス、ポリシーから、モデルを create、access、modify、 destory したいかもしれない。それらを処理する方法が必要だ。

## create

データベースにモデルのインスタンスを作成するために、<code>create()</code>を使う。

```js:
// たとえば、
User.create({
  name: 'Mike',
  age: 13,
  phoneNumber: '(512)-555-5555'
}).done(function(err, user) {

  // エラーハンドリング
  if (err) {
    return console.log(err);

  // User 作成に成功!
  }else {
    console.log("User created:", user);
  }
});
```

## find

IDでモデルを検索する場合、<code>find(id)</code>を使う。求められる基準に準拠するオブジェクトを作って渡すことで検索することもできる。

```js:
//  find by id の例
User.find(123).done(function(err, user) {

  // エラーハンドリング
  if (err) {
    return console.log(err);

  // User 作成は成功! 
  } else {
    console.log("User found:", user);
  }
});

// find by a criteria を実行
User.find({
  name: 'Steven',
  age: 32,
  phone:'(210)-555-1234'
}).done(function(err, user) {

  // エラーハンドリング
  if (err) {
    return console.log(err);

  // User 作成は成功! 
  } else {
    console.log("User found:", user);
  }
});
```

### findAll

<code>findAll()</code> で、指定した基準を満たすモデルを複数検索する。最大行数のリミット(limit)や、ページングのためのスキップ(skip)、ソートを指定することもできる。戻り件数が1件であっても、array で返す。

```js:
// たとえば、このクエリは 18歳で、アルファベット順にソートしたデータを返す。
User.findAll({
  age: 18
}).limit(10).sort('name ASC').done(function(err, users) {

  // エラーハンドリング
  if (err) {
    return console.log(err);

  // 複数のユーザーが見つかった!
  } else {
    console.log("Users found:", users);
  }
});
```

下記に更に幾つか例を挙げる。これらの中にはクエリ修飾子(？、query modifiers)を含むものもある。

```js:
// インプットフィールドで入力したままに検索
User.findAll({
  name: {
    startsWith: 'thelas'
  }
}, cb);

// インプットフィールドで入力したままに複数の属性を検索
User.findAll({
  or: [
    name: { startsWith: 'thelas' },
    email: { startsWith: 'thelas' }
  ]
}, cb);

// キーワード検索
User.findAll({
  description: {
    contains: 'roller coaster'
  }
}, cb);

// アルファベット順？検索
User.findAll({
  name: {
    '>=': 'a'
  }
}, cb);
// あと、 <=, <, >, ! も使える。クエリ修飾子参照。

// アルファベット順検索、でページング付き:
// (here's page 2)
User.findAll({
  where: {
    name: {
      '>=': 'a'
    }
  },
  limit: 15,
  skip: 15,
  sort: 'name ASC'
}, cb);
```

## dynamic finders

ビルトインの Waterline という ORM で、ダイナミックファインダーと呼ばれるとても便利なツールを使うことができる。モデルに定義した属性に応じて自動的に生成されたメソッドに対して、モデルをクエリすることができる。例えば、book モデルがあるとすると、このようになる。

```js:
var Book = {
  title: 'STRING',
  author: 'STRING',
  publisher: 'STRING',
}
module.exports = Book;
```

これらのようなメソッドを用いてDBをクエリできる。

```js:
// author でクエリ
Book.findByTitle('50 Shades of Grey').done(function(err, book) {

  // エラーハンドリング
  if (err) {
    return console.log(err);

  // Book は見つかった!
  } else {
    console.log("Book found:", book);
  }
});

// Authorで検索
Book.findAllByAuthor('John R. Erickson').done(function(err, books) {

  // エラーハンドリング
  if (err) {
    return console.log(err);

  // Book は見つかった!
  } else {
    console.log("Books found:", books);
  }
});
```
## update

<code>update()</code> で、データベースからのモデルのインスタンスを更新できる。

```js:
// たとえば、user の name を更新する。
// .update(query, params to change, callback)
User.update({
  name: 'sally'
},{
  phone: '555-555-5555'
}, function(err, user) {

  // エラーハンドリング
  if (err) {
    return console.log(err);

  // 更新は成功!
  } else {
    console.log("User updated:", user);
  }
});
```

## destroy

<code>destroy()</code>で、 データベースのモデルのインスタンスを削除することができる。 

```js:
// たとえば、Johnny という Userを削除。
// first find the user
User.destroy({
  name: 'Johnny',
  age: 22
}).done(function(err) {

  // エラーハンドリング
  if (err) {
    return console.log(err);

  // Johnny は削除された!  
  } else {
    console.log("User deleted");
  }
});
```

## Query Modifiers

修飾子(modifiers)は、データベースクエリで使われる。 多くのコードを書かずにデータベースから簡単に情報を取得できる。現在のところ、サポートしている修飾子は、<code>contains</code>、<code>or</code>、<code>startsWith</code>、<code>endsWith</code>、<code>greaterThan</code>、<code>lessThan</code>、<code>>=</code>、<code><=</code>である。下記の例を参照。

### Modifier: <code>contains</code>

<code>contains</code>修飾子は、次のように使う。

```js:
where: {
  name: {
    contains: 'James'
  }
}
```

### Modifier: <code>or</code>

<code>or</code>修飾子は、次のように使う。

```js:
where: {
  or: [{name: 'James'}, {name: 'Mike'}]
}
name: { '>': 'a' }
```

# What About Migrations?

(MySQLのような)スキーマフルなデータベースでは、マイグレーションは自動的になされる。デフォルトは、<code>migrate:alter</code>であり、Sailsはスキーマを自動的にマイグレートしようとする。

Railsにあるような明示的なプロダクションデータのマイグレーションは、今のところ存在しない。 プロダクションデータは正確であり、手動のマイグレーションは危険である。しかしながら、もし興味のある機能であれば、課題を切って欲しい、もしくはプル・リクエストならなおいい！