This Project Has Not Released Any Files
モデルからリストを取得するための設定。
クライアントにとってリストの取得はAPIで行うものであって、モデルに対して発行するものでは無い。クライアントにはまるで関係のないマニフェストである。クライアントが一覧取得を行うには、コントローラのマニフェストからAPIを生成する。
このマニフェストはコントローラの(リストを取得する)マニフェストを補足するものなので、基本的にはコントローラのリストアクションと1対1で一致することになる。コントローラと同様に、複数形で入っている。
モデルはリストを取得するときにSQLを発行するが、取得条件はリストごとに違う。この条件に統一的な法則はなく、個別に定義するしかない。しかしながら、ある程度の共通性はあるので、ここにローカルマニフェストを定義し、モデルのマニフェストと組み合わせることでコーディングなしに一般的な一覧取得を可能にしようと試みるものである。
一見このマニフェストはモデルのマニフェストに記述できそうに見えるが、モデルのマニフェストには記載すべきではない。モデルはリストを取得する際、どのようなSQLを発行するかをクライアントは知る必要ない。クライアントにとって、リストとはパラメータを与えると一覧が返る機能なので、具体的な一覧の取得処理を把握している必要ないのである。
記述例
lists = { item_names : { }, hoges: {
各アイテムが出力可能なリストのすべてに対して、出力に必要なすべてのパラメータを設定する。
モデルと結びつくアイテムの名称を設定する。省略時はコントローラーのitem_nameが設定される。マイホームのアクションのように、名称がアイテムの名称と一致しないケースに対応するために用意されている。通常は一致するので省略して良い。
このモデルのリストがツリー構造をとるとき、デフォルトのツリーの名称を文字列で設定する。省略したときはnilが設定される。
この設定はlistsから参照される。
hashで設定されたリストの取得情報に名前を付けてhashで設定する。省略したときは空のhashが補充される。
形式はname > type > argsであるから、ネストしたhashで設定する。タイプを次の中から文字列で宣言した後、必要に応じてオプションを設定し、それに名前をつける。
このリストの取得条件をどうやってひねり出すかについてhashで設定する。省略したときは空のhashが補充される。
形式はtype > argsであるから、タイプを次の中から文字列で宣言した後、必要に応じてオプションを設定する。省略したときは'auto'が補充される。
メソッド名を文字列設定する。省略したときは、リスト名に'_list_where'を追加したものが補充される。
リストの取得条件処理タイプでautoを選択したときに利用される。
このリストのinclude条件に関してhashで設定する。省略したときは空のhashが補充される。
形式はtype > argsであるから、タイプを次の中から文字列で宣言した後、必要に応じてオプションを設定する。省略したときは'auto'が補充される。
メソッド名を文字列設定する。省略したときは、リスト名に'_list_includes'を追加したものが補充される。
モデルのマニフェストのツリーパターンからincludeを生成する。
ツリーの名前を文字列で設定する。省略したときはリストグループのtree_nameから補充される。
モデルのマニフェストから取得する。
モデルのマニフェストから取得する。
list typeでpublicをを選択したときに利用される。
公開されたコンテンツの一覧を取得するためのリスト。
list typeでprivateを選択したときに利用される。
ログイン中のオペレーターからオーナーIDを取得し、それを条件として抽出するケース。コンテンツをフィルタするときに使う。
コンテンツオーナーごとのフィルタは必ず必要とされるので、特別に用意している。コンテンツの中には、 (エレメントなどのように)オーナーIDを外部のテーブルにもつパターンもあるので、エレメントルートを検索条件に組み込んでフィルタすることもできる。
なんとなく名前が間違っているような…?セレクトアイテムのロード用リストだよねこれ。システムリソースといえば、また違った意味になってしまう。
ともかく、このリストだけはマニフェストの読み込み段階で起動される例外的なモジュールなので、他のリストとは違った挙動をすることもあるかもしれない。少なくとも、記法の周りで怪しいことが確認されている。マニフェストの自動ロードがそれを引き起こしていることも確認できているので、ここに記しておく。
list typeでfilterを選択したときに利用される。
フィルタするためのカラムが自身のテーブルにあるケース。モデルの関係が従属関係にあるときに子供のモデルを親のIDで抽出する場合に使う。具体的には作家が持つ複数のコンテンツを作家IDでフィルタするなど。
絞り込みの条件となるアイテムの名称を文字列で設定する。省略した時はリスト名の先頭から'by_'を削除した文字列が補充される。
フィルタに使うカラム名を文字列で設定する。省略したときはfilter_item_nameに'_id'を追加した文字列が補充される。
panel: { lists: { by_author: { type: 'filter', }, }, },
コマの一覧であるが、ある作家についてフィルターをかけて抽出するための設定。各種設定が省略されているのでデフォルト値として、filter_item_nameとfilter_keyに'author'と'author_id'が補充され、author_idカラムをキーとして、authorのIDだけを抽出する動作をする。
デフォルトのパラメータで動作するように、リストの名称は'by_' + フィルタしたいアイテム名にしておくことを推奨する。 特定のキーを使って抽出した一覧を取得するためのリスト。
list typeでthrough_filterを選択したときに利用される。
中間テーブルを経由して接続されたモデルをフィルタするためのケース
中間モデルのモデル名を文字列設定する。省略はできない。 フィルタリストを拡張して多対多関係のモデルをフィルタするリスト。
list typeでelement_filterを選択したときに利用される。
フィルタするためのカラムが他のモデルにあるケース。具体的にはエレメントを作家ID(オペレーターではなく、よその作家の)で抽出する場合。作家IDはエレメントルートにしか存在しないので、通常のフィルタでは適応できない。 フィルタのキーが外部のモデルにあるケースに対応するため、 FilterListを拡張したもの。
list typeでplayを選択したときに利用される。 パブリックリストやプライベートリストとは全く違う系統の一覧であるものの、同じ一覧ということで仲間に入った。そもそもページ処理やパラメーターの設定方法が違うので違和感があるなら、ここから出すべき。
実装したものの役に立たないと判明。
モデルのマニフェストを参照することでモデルの関係が容易に把握できる。よって最小限の設定で動かすことができるはず。
そんな着想で開発を進めてみたが、そんなに簡単な話ではなかった。なぜなら、一覧を取得する際に他所のモデルを参照しなければならないケースがあるから。例えばスクコマ一覧を取得するにはスクロールの公開フラグおよびコンテンツオーナーをチェックしなければならない。つまりSQLではスクロールテーブルをjoinすることになる。これはコマに関連付いたスクコマの一覧を取得するときに、has_manyとは関係ないテーブルを結合する意味を持つ。
このように、モデルのマニフェストに現れない関係が含まれるので、マニフェストを参照すること自体が無意味という結論になった。
これ以外の検索条件でフィルタする場合、メソッドを直接起動することもできる。モデルにメソッドが定義されている場合、そちらを優先して使う。もちろん、メソッドは存在しない場合には、マニフェストが参照される。
[PageInfo]
LastUpdate: 2014-10-18 16:28:08, ModifiedBy: yasushiito
[Permissions]
view:all, edit:login users, delete/config:members