コマ @ PanelSpec

カラム

name和名typedefaultnulllimitnote
widthinteger200FALSE コマの幅
height高さinteger80FALSE コマの高さ
borderinteger2FALSE コマの枠線の太さ
caption要約string
publish公開integer0FALSE 公開フラグ
author_id作家integer FALSE コマの投稿者
created_at作成datetime
updated_at更新datetime

選択肢

公開フラグ

  • 0:private/非公開
  • 1:public/公開

作り方

コマは複数のモデルの集合体。コマ絵、フキダシ、景色などから構成される。もっとも注意すべき点は

  • 入力と出力でデータの表現方法が違うこと。

データ入力では通常の形式通りに保存するが、データ出力ではオブジェクトの種類別ではなく、t順に並び替えた配列で返す。

作成時の注意点として

  • 子のtをチェックする。

子のtをチェックしないと出力で話の筋道が立たないので、チェックする。

  • 子のidをチェック…しなくてもよい。

子のidをチェックしないと他所のコマの子にできてしまうかもしれない。他人のコマを汚すことができるとマズいので、チェックする予定だったが、Railsが強制的にidを上書き(親のidに合わせる)するようなので、中止した。

出力時の注意点として

  • 子をソートされた配列で返す。

ソートするために前提を決める。

  • 子には部品(Parts)と地(Ground)がある
  • 部品とは、tがあるモデル
  • 地とは、tがないモデル
  • 部品と地を合わせたものを要素(コマ要素)という
  • コマ要素では部品はtによってソートされる。
  • コマ要素では地は部品の後に追加される。

検証

width

  • nullでないこと。
  • 数値であること
  • 正の整数であること。

height

  • nullでないこと。
  • 数値であること
  • 正の整数であること。

border

  • nullでないこと。
  • 数値であること
  • 0以上の整数であること。

z

  • 数値であること
  • 正の整数であること。

publish

  • nullでないこと。
  • 数値であること

author_id

  • nullでないこと。
  • 数値であること
  • 存在する作家であること。

全体

備考

  • 認証に関する検証は含まない。

機能

デフォルト値補充

supply_default()

パラメータ

解説

  • borderに2を補充する。
  • 公開フラグに0を補充する。

上書き補充

overwrite(au)

パラメータ

  • au:作家データ

解説

  • ログイン中の作家idをauthor_idに補充する。

所持判定

own?(roles)

パラメータ

  • roles:ロールリスト

戻り

真偽

解説

自身の持ち主がロールリスト内に含まれるかどうかをTrue/Falseで返す

  • 自身にロールリストからの作家取得を依頼して、ロール内作家を取得する。
    • ロールリストを渡す。
  • ロール内作家が取得できないとき、Falseを返す。
  • ロール内作家のidが自身の作家idと一致するならTrue、しないならFalseを返す。

閲覧許可

visible?(roles)

パラメータ

  • roles:ロールリスト

戻り

真偽

解説

検査対象がコミックを閲覧できるかどうかを判定する

  • オープンモードのとき、自身にゲスト用ロールチェックを問い合わせ、その結果が偽であれば、falseを返す。
    • ロールリストを渡す。
  • クローズドモードとき、自身に読者用ロールチェックを問い合わせ、その結果が偽であれば、falseを返す。
    • ロールリストを渡す。
  • 自身に所持判定を問い合わせ、自分のコンテンツなら許可を返す。
    • ロールリストを渡す。
  • 公開されているコマなら許可を返す。
  • それ以外なら不許可を返す。

1ページの件数

self.default_page_size

パラメータ

解説

一覧取得時に返す件数のデフォルト値

  • 25を返す。

1ページの最大件数

self.max_page_size

パラメータ

解説

ユーザは一覧取得時に返す件数を指定できるが、システムは上限値を設定できる

  • 100を返す。

ページ位置補正

self.page prm = nil

パラメータ

  • prm:ページ位置

解説

一覧取得時に何ページ目を返すかの指定値を補正

  • パラメータを数値として認識する
  • 省略時は1
  • 0以下のときは1

ページ数補正

self.page_size prm = self.default_page_size

パラメータ

  • prm:ページ数

解説

一覧で取得する件数

  • パラメータを数値として認識する
  • 省略時は1
  • 0以下のときは1
  • 1ページの最大件数を上回っているなら、1ページの件数を返す。

一覧取得

list(page = 1, page_size = self.default_page_size)

パラメータ

  • page:何ページ目か
  • page_size:1ページに収まる件数

解説

  • コマを更新日時順に取得する。
  • 公開されたコマに限る
  • 関連データとして一覧取得オプションで定義されたモデルを含む。
  • ページ処理に対応し、毎ページn件の条件でmページ目から取得することができる。

マイリスト取得

mylist(author, page = 1, page_size = self.default_page_size)

パラメータ

  • author:作家データ
  • page:何ページ目か
  • page_size:1ページに収まる件数

解説

自分のコマを公開非公開に関わらず取得する。

  • コマを更新日時順に取得する。
  • パラメータで与えられた作家のコマに限る
  • 関連データとして一覧取得オプションで定義されたモデルを含む。
  • ページ処理に対応し、毎ページn件の条件でmページ目から取得することができる。

他作家のコマリスト取得

himlist(author, page = 1, page_size = self.default_page_size)

パラメータ

  • author:作家データ
  • page:何ページ目か
  • page_size:1ページに収まる件数

解説

指定した作家の公開コマを取得する。

  • コマを更新日時順に取得する。
  • パラメータで与えられた作家の公開コマに限る
  • 関連データとして一覧取得オプションで定義されたモデルを含む。
  • ページ処理に対応し、毎ページn件の条件でmページ目から取得することができる。

一覧取得オプション

下記の関連テーブルを含む

  • author
  • panel_pictures
    • picture
      • artist
      • license
  • speech_balloons
    • balloons
    • speeches
  • ground_pictures
    • picture
      • artist
      • license
  • ground_colors

json一覧出力オプション

panel_elements_as_jsonに吸収されている。

単体取得

show(id, author)

パラメータ

  • id:コマid
  • author:作家データ

解説

  • idのコマを取得する。
  • 関連データとして単体取得オプションを与えることができる。
  • コマに閲覧許可を問い合わせ、不許可なら、例外403 ActiveRecord::Forbiddenを発生させる。
  • 存在しないコマのidを要求された場合は、例外404 ActiveRecord::RecordNotFoundを発生させる。

編集取得

edit(id, author)

パラメータ

  • id:コマid
  • author:作家データ

解説

  • idのコマを取得する。
  • 関連データとして単体取得オプションで定義されたモデルを含む。
  • コマに所持判定を問い合わせ、不所持なら、例外403 ActiveRecord::Forbiddenを発生させる。
  • 存在しないコマのidを要求された場合は、例外404 ActiveRecord::RecordNotFoundを発生させる。

単体取得オプション

下記の関連テーブルを含む

  • author
  • panel_pictures
    • picture
      • artist
      • license
  • speech_balloons
    • balloons
    • speeches
  • ground_pictures
    • picture
      • artist
      • license
  • ground_colors

json単体出力オプション

panel_elements_as_jsonに吸収されている。

コマ部品集合

parts_element

パラメータ

解説

コマ部品として定義されているモデルを集合させて返す。

  • コマ絵とフキダシと絵地と色地を合わせて返す。

コマ部品

parts

パラメータ

解説

コマ部品の集合をt順に並び替えて返す。

  • コマ部品集合に問い合わせてすべてのコマ部品を取得する。
  • コマ部品をtでソートして返す。

z順コマ部品

zorderd_elements

パラメータ

解説

コマ部品の集合をz順に並び替えて返す。

  • コマ部品集合に問い合わせてすべてのコマ部品を取得する。
  • コマ部品をzでソートして返す。
  • ただし、オフセットを0で構成する。

コマ要素

panel_elements

パラメータ

解説

コマ部品と同等機能。以前は背景とコマ絵は別の概念だったので、機能が分かれていたが背景も話の順番が加わったので、統合された。しかし、互換性を確保するため残してある。

コマ要素のjson出力オプション

self.elm_json_opt e

パラメータ

  • e:コマ要素オブジェクト

解説

  • コマ要素に見合ったjson出力オプションを返す。

コマ要素のjson出力

elements

パラメータ

解説

コマのjson出力でコマ要素を埋め込むためのメソッド。jsonデータにはメソッド名で追加されるので、メソッド名は変えたくないトコロ。

  • 戻り値のための配列を初期化する。
  • コマ要素を繰り返し処理する。
    • オブジェクトをjson化する。
      • 出力フォーマットは、各オブジェクトのjson単体出力オプションに従う。
  • リストを返す。

コマのjson出力

panel_elements_as_json

パラメータ

解説

通常のjson出力はto_jsonで処理できるが、コマはデータ構成が特殊なので、専用機能を用意した。 下記の関連テーブルを含む

  • author
  • コマ要素
    • jsonデータにコマ要素のjson出力結果を追加する。

コマリストのjson出力

self.list_as_json_text ary

パラメータ

  • ary:コマのリスト

解説

通常、リストのjson出力はto_jsonで良しなに計らってくれるが、コマはデータ構成が特殊なので、専用機能を用意した。リストを(割と強引な)文字列操作でjsonテキスト化して返す。返るのはテキストなので、くれぐれも間違いなく。

  • コマのリストに含まれるすべてのコマを繰り返し処理する。
    • コマのjson出力を依頼してjsonテキストにする。
  • 繰り返し結果をカンマでつないで、[]で挟んだ文字列を返す。

脚本の表示

scenario

パラメータ

戻り

解説

コマに張り付けられたすべてのコマ要素の脚本を返す。

ライセンス素材

licensed_pictures

概要

コマ要素の中からライセンス表示が必要なものを返す。

パラメータ

戻り

  • 連想配列
    • 値は実素材、キーは実素材id

解説

  • 連想配列を初期化して、戻り値として用意する。
  • コマ絵と景色素材を合わせて、リストにする。
  • リストの各々を要素として処理する。
    • 戻り値に追加を頼む。要素の実素材idと要素に関連付けられた実素材を添える。
  • 戻り値を返す。

検証値収集

self.collect_element_value elements, name

パラメータ

  • elements:コマ要素リストのリスト
  • name:収集カラム名

解説

コマ要素リストのリスト…ってややこしい。コマ絵リストとフキダシリストを合わせてリストにしたイメージ。コマには複数のコマ絵があるので、すべてのコマ要素を取り出すには二重のネストになる。

  • コマ要素リストのリストを繰り返し処理する。
    • コマ要素リストを繰り返し処理する。
      • コマ要素のオブジェクトが回ってくるので、収集カラムの値をリストアップする。
  • 収集された値を平坦化して返す。

シリアライズチェック

self.validate_t ary

パラメータ

  • ary:t値リスト

解説

シリアライズチェックとは、0から欠落重複なく収められていること。

  • 問題なければTrueを返す。

tチェック単体

self.validate_element_t elements, name

パラメータ

  • elements:部品
  • name:検証するカラム名(:t)

解説

シリアライズチェックの準備を実施する。

  • 検証値収集を依頼して、部品からtの値リストを取り出す。
    • 部品と検証カラム名を渡す。
  • シリアライズチェックを依頼して、検証結果を得る。
    • t値リストを渡す。
  • 検証結果を返す。

tチェック

self.validate_elements_t c

パラメータ

  • c:設定の配列(各設定はHash)
    • elements:部品
    • name:検証するカラム名(:t)

解説

コマ部品は、tによって順序付けられる。各コマ部品を集合させてソートする場合、同じ値のtがあっては正しい順序が付けられない。よって、すべてのコマ部品のtが、0からの連番になるようにシリアライズされていることを検証する。

今のところtチェックの対象となるのはコマの子モデルの部品だけだが、将来的には孫部品に対しても実施することになるかもしれない(実際、過去にはフキダシのセリフにもtがあった)。idチェックとの対比をしやすいように(冗長ながらも)設定で変化させられる構成にしてある。

  • すべての設定について繰り返し処理する。
    • tチェック単体に問い合わせる。
      • 設定を渡す。
  • すべてのチェックに成功すればTrueを返す。それ以外はFalseを返す。

tチェックの設定

validate_t_list

パラメータ

解説

孫部品などに対しても機械的にtチェックできるように設定をリスト化する。

各設定はHashで記述され、それらが配列で返る。Hashに定義するキーは、elements(チェック対象のオブジェクト集合)とname(検証するカラム名)。

  • 第一設定
    • elements:部品
    • name:t

従属データの検証

validate_child

パラメータ

解説

ここでは従属するデータの中でも単体で検証できない項目を検証する。

  • 要素順(t)の崩壊を阻止するために、tチェックを問い合わせる。
    • 設定をtチェックの設定に問い合わせて渡す。
  • コマのすげ替えを阻止するために、idチェックを問い合わせ…なくてもいいみたい。
    • 設定をidチェックの設定に問い合わせて渡す。
  • 重なり順(z)の崩壊を阻止…まではいいや。
  • すべて通ればTrueを返す。それ以外はFalseを返す。

保存

store attr, author

パラメータ

  • attr:コマのカラム値
  • au:コマの作家アカウント

解説

コマデータを保存するだけの機能である。だけ、といっても実際の処理は複雑で、複数のモデルに変更が及ぶ。よって、処理はトランザクションでロールバックできるようする。

コマの保存は、同時に従属するデータ(コマ絵・フキダシなど)を保存する。それらのデータは、カラム値に含まれるものとする。当処理は子モデルを含めた形をあるがままに保存しなければならない。つまり、コマの保存ですべての従属データも保存される。

それぞれの従属データは、保存時に各モデルで検証を受けるので、微細な検証は必要ないが、特殊な検証もあるので、外部機能でサポートしてもらう。部品の順序チェックは削除が実行されるまで処理できないとが判明したので、保存処理の後に移動した。

  • カラム値をセットする。
  • コマモデルに上書き補充を依頼する。
    • 作家アカウントを渡す。
  • 自身を保存する。
  • 従属データの検証を問い合わせる。
  • 例外ケース
    • 以下の場合、全体エラーにメッセージをセットしてロールバックする。
    • カラム値がFalseの場合、カラム値が不正だった。
    • 従属データの検証に失敗した。

削除

destroy_with_elements

戻り

真偽

解説

配下の削除をしてから、自身を削除する。ただし、失敗したときはロールバックしてFalseを返す。

休眠機能

id一致チェック

self.validate_id ary, pid

パラメータ

  • ary:検査値リスト
  • pid:親id

解説

親子関係のモデルを保存するとき、正しい親子関係になっているかチェックしたい。

例として、コマ絵とフキダシはpanel_idによってコマとリンクしている。これを更新時にこっそり別のコマにリンクさせると、他人のコマにコマ絵を追加して改変できてしまう。そこでid一致チェックする。

  • 新規作成時はまだ親idが決定されていないので、子の親idは必ずnullでなければならない。
    • こうしてnilにしておけば、Railsが気を利かせて保存時に適切にリンクしてくれる。
  • 更新時は親idが決定されているので、子の親idが親のidと一致していなければならない。ただし、既存の親に新規の子を追加するケースもあるので、nilでも問題ない。

以上をまとめると、

  • 親idがnilのとき
    • 検査値がnilなら正常、それ以外は異常。
  • 親idが決定済のとき
    • 検査値が親idと一致しているか、nilなら正常、それ以外は異常。

となる。

  • すべての検査値リストを繰り返し処理する。
    • 検査する。
  • 全件問題なければTrueを返す。

idチェック単体

self.validate_element_id elements, name, parent_id

パラメータ

  • elements:チェック対象オブジェクトの集合
  • name:検証するカラム名
  • parent_id:親id

解説

id一致チェックの準備を実施する。

  • 検証値収集を依頼して、チェック対象オブジェクトの集合からidの値リストを取り出す。
    • チェック対象オブジェクトの集合と検証カラム名を渡す。
  • id一致チェックを依頼して、検証結果を得る。
    • id値リストと親idを渡す。
  • 検証結果を返す。

idチェック

self.validate_elements_id c

パラメータ

  • c:設定の配列(各設定はHash)
    • elements:チェック対象オブジェクトの集合
    • name:検証するカラム名
    • parent_id:親id

解説

  • すべての設定について繰り返し処理する。
    • idチェック単体に問い合わせる。
      • 設定を渡す。
  • すべてのチェックに成功すればTrueを返す。それ以外はFalseを返す。

idチェックの設定

validate_id_list

パラメータ

解説

孫部品などに対しても機械的にidチェックできるように設定をリスト化する。

各設定はHashで記述され、それらが配列で返る。Hashに定義するキーは、elements(チェック対象のオブジェクト集合)とname(検証するカラム名)とparent_id(チェック対象の親のid)。

  • 第一設定
    • elements:コマ部品とコマ地の集合
    • name:panel_id
    • parent_id:コマid
  • 第二設定(すべてのフキダシについて設定する)
    • elements:フキダシ枠とセリフの集合
    • name:speech_balloon_id
    • parent_id:フキダシid