ManifestModel @ AboutManifest

記述例

  model_name1: {
    table_name: 'model_names',
    associations: {
      belongs_to: {
        belongs_to_model_name: {
          id_column: 'author_id'
        }, 
      },
      has_many: {
        has_many_model_name: {
          foreign_key: 'scroll_id',
          model_name: 'scroll_panel',
        }, 
      },
    },
    attributes: {
      id: {
        type: 'number',
        primary_key: 1,
        rules : {
          number: true,
        }
      },
      title: {
        type: 'text',
        rules : {
          required: true,
        }
      },
    },
  },
  model_name2: {

データベースで管理するすべてのアイテム(この場合、model_name1およびmodel_name2)に 対して、関連モデル、カラム、一覧を定義する。

記述

table_name

アイテム名やモデル名を複数形にするための項目。名詞を単数形・複数形に変換する環境は用意されていないことが多いので、マニフェストに含めることにした。どうしてもないと困るので、必須項目とした。

associations

このモデルのrelationshipに関して次の三種類をhashで設定する。省略したときは空のhashが補充される。

  • belongs_to
  • has_many
  • has_one

形式はname > valueである

belongs_to

所属するモデルについての設定

model_name

このアイテムが所属するモデル名を文字列で設定する。省略したときには所属名が補充される。

id_column

所属するモデルを参照するためのIDが入っているカラム名を文字列で設定する。省略したときは所属名に_idを追加した文字列が補充される。

次の例ではmodel_nameに'artist'が補充され、id_columnには'artist'+'_id'の'artist_id'が補充される。

      belongs_to: {
        artist: {
        }, 
      },

has_many

所持するモデルについての設定

model_name

アイテムが所持するモデル名を文字列で設定する。省略したときには所属名を単数形にしたものが補充される。

この活用するために、コントローラのマニフェストを利用することもある。 railsには複数形を単数形に戻す辞書が備わっているので問題ない。しかし、 JavaScriptなどではこれがないために、自前で変換しなければならない。手っ取り早い辞書はコントローラのマニフェストにあるので、これを利用して変換するのであるが、コントローラとモデルが必ずしも一致するわけではないので問題があるかもしれない。また、マニフェストの初期化順序によっては機能しないこともあるので、不安定要因の項目と言える。

foreign_key

外部キーを文字列で設定する。省略はできない。

through

中間モデルを経由して連結している場合にモデル名を文字列で設定する。直接連結している場合には設定する必要はない。

次の例ではscroll_panelsでscroll_panelモデルと連結させている。scroll_idカラムのIDが一致する条件で該当するデータを取得できる。

      has_many: {
        scroll_panels: {
          foreign_key: 'scroll_id',
          model_name: 'scroll_panel',
        }, 
      },

has_one

所持するモデルについての設定

連結するデータが単数であること以外、has_manyと同じである。

model_name

foreign_key

attributes

このモデルのカラムに関してhashで設定する。省略したときは空のhashが補充される。

形式はname > valueである。type項目があるが関係ない。今のところ型ごとに処理を変える必要がないからである。

type

カラムの型を文字列で指定する。省略はできない。どのような型があるかはデータベースによって変わってくるが、おおむね次のようなものである。

  • number
  • text
  • float
  • datetime

primary_key

Primary keyフラグを数値で設定する。省略したときは0が補充される。

  • 0:カラムはprimary keyではない。
  • 1:カラムはprimary keyである。

rules

カラムの入力規則をhashで設定する。省略したときは空のhashが補充される。

この項目の値はjqueryのバリデータプラグインにそのまま渡される。

次の例では、数値型のIDカラムはテーブルのプライマリキーで、人力規則は数値であることを、設定している。

      id: {
        type: 'number',
        primary_key: 1,
        rules : {
          number: true,
        }
      },

次の例では、文字列型のタイトルカラムは、入力規則に必須項目であることを設定している。

      title: {
        type: 'text',
        rules : {
          required: true,
        }
      },

source

フィールドが選択ボックスの時、選択肢のアイテムを取得するためのソースををhashで設定する。省略したときは無視される。

データベースから取得する選択肢はマニフェストのselect_items['model']に収められており、システム定数から取得する選択肢はselect_items['magic_number']に収められている。ここで選択肢の取得先を決める。選択肢を読み込む処理はマニフェストを起動するときにselect_items_loaderで行われる。

形式はtype > argsである

type

ソースの一覧取得処理タイプを次の中から文字列で設定する。省略はできない。

  • model データベースからマスターテーブルを取得する。
  • filter データベースからフィルタを使って随時取得する。
  • magic_number 定数から取得する

args

選択肢のアイテムを取得するの処理に必要なオプションを与えるための設定。記述するべき内容はタイプによって違ってくる。

has_translation

翻訳テキストがあるかどうかフラグを数値で設定する。

一覧はユーザー向けのキャプションとIDのペアで構成されているが、キャプション部分を翻訳ファイルのキーとみなしてローカライズに対応することもできる。

  • 0:翻訳せずにそのまま利用する
  • 1:翻訳キーとみなして翻訳する。

デフォルトでは定数から取得するとき1、データベースから取得するとき1とする。

ModelSource

source typeでmodelを選択したときに利用される。

select_item_name

マニフェストのselect_itemsで設定されている名称を文字列で設定する。省略はできない。

FilterSource

source typeでfilterを選択したときに利用される。

マスタデータではなく、ある条件によってフィルタされるリストを選択肢として利用したいときに使う。マスタデータではないので、システム起動時ではなく、随時SQLが発行され取得される。

例えば、原画にライセンスを割り当てる工程でライセンスを選択するケースがある。ここでは事前に選択されたライセンスグループのライセンスだけを選択肢としたいので、ライセンスグループIDでフィルタする必要がある。

この項目を利用するための条件として、同一モデルにフィルタ対象となるIDのカラムが存在しなければならない。先程の例で言えば、ライセンスグループIDが必要である。これは、フィルタの条件を取得するための糸口が見付からなかったためにこうなった。もっと良い引渡し方があるなら変更しても良い。

filter_column_name

フィルタの条件にするIDのカラムの名称を文字列で設定する。省略はできない。

MagicNumberSource

source typeでmodelをを選択したときに利用される。

select_item_name

マニフェストのselect_itemsで設定されている名称を文字列で設定する。省略はできない。

サンプル

  speech: {
    attributes: {
      writing_format_id: {
        type: 'number',
        source: {
          type: 'model',
          args: {
            select_item_name: 'writing_format_items',
          },
        },
      },
      font_size: {
        type: 'float',
        source: {
          type: 'magic_number',
          args: {
            select_item_name: 'speech_font_size_items',
          },
        },
      },
    },

writing_format_idの選択肢はモデルから取得されており、マニフェストのselect_items['model']['writing_format_items']にある。一方、font_sizeは定数から取得されており、マニフェストのselect_items['model']['speech_font_size_items']にある。

tree

関連するモデルに名前をつけるための設定をhashで設定する。省略したときは空のhashが補充される。

形式はname > valueである

サンプル

  scroll_panel: {
    tree: {
      owner: 'scroll',
      scroll_owner: 'scroll',
    },
  },

ここは割と厄介なので、詳し目に説明。

関連モデルはassociationsに現れるが、この情報は無機質なため、意味を持たせた関連を表すことができない。これは、パネルにぶら下がるモデルのうち、どれがエレメントなのかを追跡できないことを意味する。また、エレメントを作家別に抽出することもできないことになる。エレメントにはオーナーIDが設定されないので、エレメントルートまで関連を追跡できないので。

そこで、この設定で一連の関連モデルを名前でグループ化する。

基本的にはエレメントからルートを探すための情報なので、親(所属先)の方向しか進めないので注意すること。また、この設定を一覧取得のinclude句を生成するための情報として利用している。

list

リストの設定をhashで設定する。省略したときは空のhashが補充される。

形式はname > valueである

default_page_size

一回のリクエストで取得できる件数のデフォルト値を設定する。省略したときは25が設定される。

max_page_size

一回のリクエストで取得できる件数の最大値を設定する。省略したときは100が設定される。