ManifestListGroup @ AboutManifest

モデルからリストを取得するための設定。

クライアントにとってリストの取得はAPIで行うものであって、モデルに対して発行するものでは無い。クライアントにはまるで関係のないマニフェストである。クライアントが一覧取得を行うには、コントローラのマニフェストからAPIを生成する。

このマニフェストはコントローラの(リストを取得する)マニフェストを補足するものなので、基本的にはコントローラのリストアクションと1対1で一致することになる。コントローラと同様に、複数形で入っている。

前置き

モデルはリストを取得するときにSQLを発行するが、取得条件はリストごとに違う。この条件に統一的な法則はなく、個別に定義するしかない。しかしながら、ある程度の共通性はあるので、ここにローカルマニフェストを定義し、モデルのマニフェストと組み合わせることでコーディングなしに一般的な一覧取得を可能にしようと試みるものである。

一見このマニフェストはモデルのマニフェストに記述できそうに見えるが、モデルのマニフェストには記載すべきではない。モデルはリストを取得する際、どのようなSQLを発行するかをクライアントは知る必要ない。クライアントにとって、リストとはパラメータを与えると一覧が返る機能なので、具体的な一覧の取得処理を把握している必要ないのである。

記述例

lists = {
  item_names : {
  },
  hoges: {

各アイテムが出力可能なリストのすべてに対して、出力に必要なすべてのパラメータを設定する。

記述

item_name

モデルと結びつくアイテムの名称を設定する。省略時はコントローラーのitem_nameが設定される。マイホームのアクションのように、名称がアイテムの名称と一致しないケースに対応するために用意されている。通常は一致するので省略して良い。

tree_name

このモデルのリストがツリー構造をとるとき、デフォルトのツリーの名称を文字列で設定する。省略したときはnilが設定される。

この設定はlistsから参照される。

lists

hashで設定されたリストの取得情報に名前を付けてhashで設定する。省略したときは空のhashが補充される。

形式はname > type > argsであるから、ネストしたhashで設定する。タイプを次の中から文字列で宣言した後、必要に応じてオプションを設定し、それに名前をつける。

  • 'public'
  • 'private'
  • 'system_resource'
  • 'filter'
  • 'through_filter'
  • 'foreign_filter'
  • 'play'

すべてのリストに共通する設定

where

このリストの取得条件をどうやってひねり出すかについてhashで設定する。省略したときは空のhashが補充される。

形式はtype > argsであるから、タイプを次の中から文字列で宣言した後、必要に応じてオプションを設定する。省略したときは'auto'が補充される。

  • method メソッド名を指定する
  • auto 最適な条件を生成する

method メソッド名を指定する場合

method_name

メソッド名を文字列設定する。省略したときは、リスト名に'_list_where'を追加したものが補充される。

auto 最適な条件を生成する場合

リストの取得条件処理タイプでautoを選択したときに利用される。

includes

このリストのinclude条件に関してhashで設定する。省略したときは空のhashが補充される。

形式はtype > argsであるから、タイプを次の中から文字列で宣言した後、必要に応じてオプションを設定する。省略したときは'auto'が補充される。

  • method メソッド名を指定する
  • auto 最適な条件を生成する

method メソッド名を指定する場合

method_name

メソッド名を文字列設定する。省略したときは、リスト名に'_list_includes'を追加したものが補充される。

auto 最適な条件を生成する場合

モデルのマニフェストのツリーパターンからincludeを生成する。

tree_name

ツリーの名前を文字列で設定する。省略したときはリストグループのtree_nameから補充される。

order

default_page_size

モデルのマニフェストから取得する。

max_page_size

モデルのマニフェストから取得する。

PublicList

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

公開されたコンテンツの一覧を取得するためのリスト。

PrivateList

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

ログイン中のオペレーターからオーナーIDを取得し、それを条件として抽出するケース。コンテンツをフィルタするときに使う。

コンテンツオーナーごとのフィルタは必ず必要とされるので、特別に用意している。コンテンツの中には、 (エレメントなどのように)オーナーIDを外部のテーブルにもつパターンもあるので、エレメントルートを検索条件に組み込んでフィルタすることもできる。

SystemResourceList

なんとなく名前が間違っているような…?セレクトアイテムのロード用リストだよねこれ。システムリソースといえば、また違った意味になってしまう。

ともかく、このリストだけはマニフェストの読み込み段階で起動される例外的なモジュールなので、他のリストとは違った挙動をすることもあるかもしれない。少なくとも、記法の周りで怪しいことが確認されている。マニフェストの自動ロードがそれを引き起こしていることも確認できているので、ここに記しておく。

FilterList

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

フィルタするためのカラムが自身のテーブルにあるケース。モデルの関係が従属関係にあるときに子供のモデルを親のIDで抽出する場合に使う。具体的には作家が持つ複数のコンテンツを作家IDでフィルタするなど。

filter_item_name

絞り込みの条件となるアイテムの名称を文字列で設定する。省略した時はリスト名の先頭から'by_'を削除した文字列が補充される。

filter_key

フィルタに使うカラム名を文字列で設定する。省略したときはfilter_item_nameに'_id'を追加した文字列が補充される。

サンプル
  panel: {
    lists: {
      by_author: {
        type: 'filter',
      },
    },
  },

コマの一覧であるが、ある作家についてフィルターをかけて抽出するための設定。各種設定が省略されているのでデフォルト値として、filter_item_nameとfilter_keyに'author'と'author_id'が補充され、author_idカラムをキーとして、authorのIDだけを抽出する動作をする。

デフォルトのパラメータで動作するように、リストの名称は'by_' + フィルタしたいアイテム名にしておくことを推奨する。 特定のキーを使って抽出した一覧を取得するためのリスト。

ThroughFilterList

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

中間テーブルを経由して接続されたモデルをフィルタするためのケース

through

中間モデルのモデル名を文字列設定する。省略はできない。 フィルタリストを拡張して多対多関係のモデルをフィルタするリスト。

ForeignFilterList

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

フィルタするためのカラムが他のモデルにあるケース。具体的にはエレメントを作家ID(オペレーターではなく、よその作家の)で抽出する場合。作家IDはエレメントルートにしか存在しないので、通常のフィルタでは適応できない。 フィルタのキーが外部のモデルにあるケースに対応するため、 FilterListを拡張したもの。

PlayList

list typeでplayを選択したときに利用される。 パブリックリストやプライベートリストとは全く違う系統の一覧であるものの、同じ一覧ということで仲間に入った。そもそもページ処理やパラメーターの設定方法が違うので違和感があるなら、ここから出すべき。

失敗したよ

HasManyList

実装したものの役に立たないと判明。

モデルのマニフェストを参照することでモデルの関係が容易に把握できる。よって最小限の設定で動かすことができるはず。

そんな着想で開発を進めてみたが、そんなに簡単な話ではなかった。なぜなら、一覧を取得する際に他所のモデルを参照しなければならないケースがあるから。例えばスクコマ一覧を取得するにはスクロールの公開フラグおよびコンテンツオーナーをチェックしなければならない。つまりSQLではスクロールテーブルをjoinすることになる。これはコマに関連付いたスクコマの一覧を取得するときに、has_manyとは関係ないテーブルを結合する意味を持つ。

このように、モデルのマニフェストに現れない関係が含まれるので、マニフェストを参照すること自体が無意味という結論になった。

PublicList

PrivateList

SystemResourceList

FilterList

ThroughFilterList

ElementFilterList

PlayList

その他のフィルタ

これ以外の検索条件でフィルタする場合、メソッドを直接起動することもできる。モデルにメソッドが定義されている場合、そちらを優先して使う。もちろん、メソッドは存在しない場合には、マニフェストが参照される。