狠狠撸

狠狠撸Share a Scribd company logo
Customization  DBIC::Schema::Loader d:id:ZIGOROu Toru Yamaguchi <zigorou@cpan.org>
Agenda DBIC::Schema::Loader のおさらい make_schema_at() 生成されたファイル自体に拡張 inc パスの追加による拡張 really_erase_files  の値 Schema クラスも拡張対象にする DBIC::Schema::Loader を改造 DBIC::Schema::Loader の概要 名前に制約をつけてリレーション設定 まとめ
make_schema_at() DBIC::Schema::Loader のメソッド 引数 1. schema クラス名 2.  生成オプション  (HAShref) 3. connect_info (ARRAYREF) 基本系 #!/usr/bin/perl use  FindBin;  use  File::Spec;  use  DBIx::Class::Schema::Loader  qw(make_schema_at) ;  make_schema_at(  'MyApp::DBIC::Schema' , {  dump_directory  => File::Spec->catfile( $FindBin::Bin ,  '..' ,  'lib' ),  relly_erase_files  =>  1 , },  [ 'dbi:mysql:database=dbictest' ,  'root' ],  );
拡張 (1) ファイル直書き方式 - 1 生成されたファイルに拡張 生成された Schema, Table クラスそれぞれの下の方に “ DO NOT MODIFY THIS ”  と書かれたコメントがある そこから “ You can replace this text ”  の領域は拡張領域で自動生成の対象ではない 生成されたファイルに直接書いて良い 追加で load_components() したりとか あるいは他のプラグインのメソッド叩いたり テーブル定義をゴニョゴニョしたりとか
拡張 (1) ファイル直書き方式 - 2 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:WFbbTfTFDFr/kewSj3QwAw package  MyApp::DBIC::Schema; __PACKAGE__->load_components( qw/+MyApp::DBIC::MyComp/ ); __PACKAGE__->init_mycomp; # You can replace this text with custom content, and it will be preserved on regeneration   1 ;
拡張 (2) incにあるテンプレ読み込み方式 - 1 incパスに通したテンプレからinclude use libで適当なディレクトリにパスを通すと、そこにあるファイルを対応するモジュールの拡張領域に差し込んでくれる機能 ここで注意しないとダメなのはSchemaクラスは対象外 Tableクラスのみ拡張可能 ちなみに拡張領域の箇所はファイル直書き方式と同じ
拡張 (2) incにあるテンプレ読み込み方式 - 2 ディレクトリ構成 lib MyApp DBIC Schema User.pm schema MyApp DBIC Schema User.pm 自動生成される領域 Include ( ファイルの下部にくっつく )
make_schema_at() [2] really_erase_files ( 生成オプション ) true の時 毎回ファイルを消して生成する Schema, Table クラス両方消しちゃうので、 ファイル直書き方式は使えない >< 必然的に include になるが、 Schema に対しては適用出来ない false の時 毎回ファイルを消さない 直書き方式が使える 但し消さないと include で挿入されたブロックが次回の直書きと見なされ、再び include されるので重複コードになるwww
ここまでのまとめ 現在の問題点 Schema, Table 共に後付的に拡張したい Schema も対象にするなら really_erase_files を false にする そうすると直書き領域に make_schema_at する度に重複するコードが出来てしまう どうすれば良いか really_erase_files => 0 でも自分で Table クラスを消せば同じ事になる 拡張は  Schema  は直書き、 Table は include でやる。
改良版Schema生成 改良版 #!/usr/bin/perl use strict ; use warnings ; use  FindBin; use  File::Spec; use lib  (  File::Spec->catfile(  $FindBin::Bin ,  qw/.. lib/  ), File::Spec->catfile(  $FindBin::Bin ,  qw/.. schema/  ) ); use  DBIx::Class::Schema::Loader  qw(make_schema_at) ; die   unless   @ARGV ;  my   $schema_class  =  'MyClass::DBIC::Schema' ; #  こんな感じで自分で消す unlink (  glob ( File::Spec->catdir(  $FindBin::Bin ,  '..' ,  'lib' ,  split (  / :: / ,  $schema_class  ) ) .  '/*.pm'  ) ); make_schema_at( $schema_class ,  {  components  => [  qw/ResultSetManager UTF8Columns InflateColumn::DateTime TimeStamp/  ], dump_directory  => File::Spec->catfile(  $FindBin::Bin ,  qw/.. lib/  ), debug  =>  0 , really_erase_my_files  =>  0 , },  \@ARGV );
さらなる改良 Schema::Loader について 中で何やってるか理解すればもっとカスタマイズ出来そう 特にリレーションとか通常の使い方では手出しできない部分を何とかしたい まずはクラス図から
Class::Diagram of DBIC::Schema::Loader Class Diagram DBIC::Schema::Loader DBIC::Schema ::Loader::Base DBIC::Schema ::Loader::Base::DBI::mysql DBIC::Schema ::Loader::RelBuilder 各ドライバごとにクラスがある リレーションの構築 Dump 時のオプションの詳細
RelationShip [1] belongs_to とか has_many とか belongs_to(“user_id”, ...) $rs-> user_id -> user_id ダサすぎ  残念ながら現在はこうなる belongs_to(“user”, ...) $rs-> user -> user_id $rs-> user_id  も OK 自然になる こうしたい
RelationShip [2] 問題の箇所 DBIC::Schema::Loader::Base の _load_relationship() foreach   my   $src_class  ( sort   keys   %$rel_stmts ) { my   $src_stmts  =  $rel_stmts ->{ $src_class }; foreach   my   $stmt  ( @$src_stmts ) { ###  ここら辺を書き換えちゃえば良い $self ->_dbic_stmt( $src_class , $stmt ->{method},  ## belongs_to とか @{ $stmt ->{args}}  ## belongs_to の引数リスト );  } }
RelationShip [4] 改良版 foreach   my   $src_class  (  sort   keys   %$rel_stmts  ) { my   $src_stmts  =  $rel_stmts ->{ $src_class }; foreach   my   $stmt  ( @$src_stmts ) { ### belongs_to の時だけ無茶する if  (  $stmt ->{method}  eq   'belongs_to'  ) { my   $table_class_suffix  = [  split / :: /  =>  $stmt ->{args}->[ 1 ] ]->[ -1 ]; $stmt ->{args}->[ 0 ] =  String::CamelCase::decamelize( $table_class_suffix );  }  $self ->_dbic_stmt(  $src_class ,  $stmt ->{method}, @{  $stmt ->{args} } ); } }
まとめ Schema::Loader との付き合いかた really_erase_files を false でも自分で Table 消す Schema は直書き、 Table は include で辻褄合わせる belongs_to は問題箇所を redifine する 名前でコード生成時の制約をつけるのは良さそう。 on_created, on_updated(DATETIME)  で  NOW() 相当とか 時間の都合上割愛したけど、それ以上は自分で DBIC 流儀のプラグイン書く  ( 割と便利 ) そこまでするなら自分で Loader 書くべき?(ぇ あるいは DBIC を使わない
おしまい ご清聴ありがとうございました

More Related Content

What's hot (18)

奥辞谤诲笔谤别蝉蝉関数の処理コストを考えよう
奥辞谤诲笔谤别蝉蝉関数の処理コストを考えよう奥辞谤诲笔谤别蝉蝉関数の処理コストを考えよう
奥辞谤诲笔谤别蝉蝉関数の処理コストを考えよう
Naoki Matsuda
?
Rails Controller Fundamentals
Rails Controller FundamentalsRails Controller Fundamentals
Rails Controller Fundamentals
Takashi SAKAGUCHI
?
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
kenjis
?
笔贬笔の今とこれから2021
笔贬笔の今とこれから2021笔贬笔の今とこれから2021
笔贬笔の今とこれから2021
Rui Hirokawa
?
PHP, Now and Then 2011
PHP, Now and Then 2011PHP, Now and Then 2011
PHP, Now and Then 2011
Rui Hirokawa
?
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
Rui Hirokawa
?
omoon.org の裏側 ?FuelPHP の task 活用例?
omoon.org の裏側 ?FuelPHP の task 活用例?omoon.org の裏側 ?FuelPHP の task 活用例?
omoon.org の裏側 ?FuelPHP の task 活用例?
Sotaro Omura
?
あらためて笔贬笔5.3
あらためて笔贬笔5.3あらためて笔贬笔5.3
あらためて笔贬笔5.3
Masashi Shinbara
?
LexADV_TryDDM Ver. 0.1bの概要
LexADV_TryDDM Ver. 0.1bの概要LexADV_TryDDM Ver. 0.1bの概要
LexADV_TryDDM Ver. 0.1bの概要
ADVENTURE Project
?
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
hiro345
?
贵耻别濒笔贬笔で3种の辫谤辞蹿颈濒别谤を使ってみた
贵耻别濒笔贬笔で3种の辫谤辞蹿颈濒别谤を使ってみた贵耻别濒笔贬笔で3种の辫谤辞蹿颈濒别谤を使ってみた
贵耻别濒笔贬笔で3种の辫谤辞蹿颈濒别谤を使ってみた
Katsuhiro Miura
?
PDOでデータベース接続と SQLインジェクション対策
PDOでデータベース接続と SQLインジェクション対策PDOでデータベース接続と SQLインジェクション対策
PDOでデータベース接続と SQLインジェクション対策
iPride Co., Ltd.
?
CGI::Application::Dispatch
CGI::Application::DispatchCGI::Application::Dispatch
CGI::Application::Dispatch
Hideo Kimura
?
Rake
RakeRake
Rake
Tomoya Kawanishi
?
.丑迟补肠肠别蝉蝉によるリダイレクト彻底解説
.丑迟补肠肠别蝉蝉によるリダイレクト彻底解説.丑迟补肠肠别蝉蝉によるリダイレクト彻底解説
.丑迟补肠肠别蝉蝉によるリダイレクト彻底解説
Cherry Pie Web
?
奥辞谤诲笔谤别蝉蝉で投稿记事情报の取得方法
奥辞谤诲笔谤别蝉蝉で投稿记事情报の取得方法奥辞谤诲笔谤别蝉蝉で投稿记事情报の取得方法
奥辞谤诲笔谤别蝉蝉で投稿记事情报の取得方法
regret raym
?
奥辞谤诲笔谤别蝉蝉関数の処理コストを考えよう
奥辞谤诲笔谤别蝉蝉関数の処理コストを考えよう奥辞谤诲笔谤别蝉蝉関数の処理コストを考えよう
奥辞谤诲笔谤别蝉蝉関数の処理コストを考えよう
Naoki Matsuda
?
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
kenjis
?
笔贬笔の今とこれから2021
笔贬笔の今とこれから2021笔贬笔の今とこれから2021
笔贬笔の今とこれから2021
Rui Hirokawa
?
PHP, Now and Then 2011
PHP, Now and Then 2011PHP, Now and Then 2011
PHP, Now and Then 2011
Rui Hirokawa
?
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
Rui Hirokawa
?
omoon.org の裏側 ?FuelPHP の task 活用例?
omoon.org の裏側 ?FuelPHP の task 活用例?omoon.org の裏側 ?FuelPHP の task 活用例?
omoon.org の裏側 ?FuelPHP の task 活用例?
Sotaro Omura
?
LexADV_TryDDM Ver. 0.1bの概要
LexADV_TryDDM Ver. 0.1bの概要LexADV_TryDDM Ver. 0.1bの概要
LexADV_TryDDM Ver. 0.1bの概要
ADVENTURE Project
?
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
hiro345
?
贵耻别濒笔贬笔で3种の辫谤辞蹿颈濒别谤を使ってみた
贵耻别濒笔贬笔で3种の辫谤辞蹿颈濒别谤を使ってみた贵耻别濒笔贬笔で3种の辫谤辞蹿颈濒别谤を使ってみた
贵耻别濒笔贬笔で3种の辫谤辞蹿颈濒别谤を使ってみた
Katsuhiro Miura
?
PDOでデータベース接続と SQLインジェクション対策
PDOでデータベース接続と SQLインジェクション対策PDOでデータベース接続と SQLインジェクション対策
PDOでデータベース接続と SQLインジェクション対策
iPride Co., Ltd.
?
CGI::Application::Dispatch
CGI::Application::DispatchCGI::Application::Dispatch
CGI::Application::Dispatch
Hideo Kimura
?
.丑迟补肠肠别蝉蝉によるリダイレクト彻底解説
.丑迟补肠肠别蝉蝉によるリダイレクト彻底解説.丑迟补肠肠别蝉蝉によるリダイレクト彻底解説
.丑迟补肠肠别蝉蝉によるリダイレクト彻底解説
Cherry Pie Web
?
奥辞谤诲笔谤别蝉蝉で投稿记事情报の取得方法
奥辞谤诲笔谤别蝉蝉で投稿记事情报の取得方法奥辞谤诲笔谤别蝉蝉で投稿记事情报の取得方法
奥辞谤诲笔谤别蝉蝉で投稿记事情报の取得方法
regret raym
?

Viewers also liked (8)

Woman
WomanWoman
Woman
olumisti
?
B Dent2 Reviewfeedbacksession2008
B Dent2 Reviewfeedbacksession2008B Dent2 Reviewfeedbacksession2008
B Dent2 Reviewfeedbacksession2008
jeremyc
?
4. Transformasi Struktural Proses Distribusi
4. Transformasi Struktural Proses Distribusi4. Transformasi Struktural Proses Distribusi
4. Transformasi Struktural Proses Distribusi
gaffari
?
Internet eta mugikortasuna
Internet eta mugikortasunaInternet eta mugikortasuna
Internet eta mugikortasuna
Elurnet Informatika Zerbituzak
?
Inside mbga Open Platform API architecture
Inside mbga Open Platform API architectureInside mbga Open Platform API architecture
Inside mbga Open Platform API architecture
Toru Yamaguchi
?
Thinking Hybrid - Python/C++ Integration
Thinking Hybrid - Python/C++ IntegrationThinking Hybrid - Python/C++ Integration
Thinking Hybrid - Python/C++ Integration
Guy K. Kloss
?
Eic2008munich1
Eic2008munich1Eic2008munich1
Eic2008munich1
Doc Searls
?
B Dent2 Reviewfeedbacksession2008
B Dent2 Reviewfeedbacksession2008B Dent2 Reviewfeedbacksession2008
B Dent2 Reviewfeedbacksession2008
jeremyc
?
4. Transformasi Struktural Proses Distribusi
4. Transformasi Struktural Proses Distribusi4. Transformasi Struktural Proses Distribusi
4. Transformasi Struktural Proses Distribusi
gaffari
?
Inside mbga Open Platform API architecture
Inside mbga Open Platform API architectureInside mbga Open Platform API architecture
Inside mbga Open Platform API architecture
Toru Yamaguchi
?
Thinking Hybrid - Python/C++ Integration
Thinking Hybrid - Python/C++ IntegrationThinking Hybrid - Python/C++ Integration
Thinking Hybrid - Python/C++ Integration
Guy K. Kloss
?

Similar to Customization of DBIC::Schema::Loader (20)

Ruby on Rails Tutorial
Ruby on Rails TutorialRuby on Rails Tutorial
Ruby on Rails Tutorial
Ken Iiboshi
?
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
Y Watanabe
?
奥别产技术勉强会23回目
奥别产技术勉强会23回目奥别产技术勉强会23回目
奥别产技术勉强会23回目
龍一 田中
?
搁补颈濒蝉3.1谤肠4を试してみた
搁补颈濒蝉3.1谤肠4を试してみた搁补颈濒蝉3.1谤肠4を试してみた
搁补颈濒蝉3.1谤肠4を试してみた
Takahiro Hidaka
?
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
Toru Yamaguchi
?
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
kenjis
?
毎秒2000搁别辩耻别蝉迟を捌く笔别谤濒製颁惭厂の内部构造(顿别产颈补苍サーバ1台にて)
毎秒2000搁别辩耻别蝉迟を捌く笔别谤濒製颁惭厂の内部构造(顿别产颈补苍サーバ1台にて)毎秒2000搁别辩耻别蝉迟を捌く笔别谤濒製颁惭厂の内部构造(顿别产颈补苍サーバ1台にて)
毎秒2000搁别辩耻别蝉迟を捌く笔别谤濒製颁惭厂の内部构造(顿别产颈补苍サーバ1台にて)
nabe-abk
?
Rails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3editionRails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3edition
Satomi Tsujita
?
惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる
惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる
惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる
jamadam
?
11 word pressカスタマイズ(テーマ編)
11 word pressカスタマイズ(テーマ編)11 word pressカスタマイズ(テーマ編)
11 word pressカスタマイズ(テーマ編)
文樹 高橋
?
厂肠补濒补2.8への移行
厂肠补濒补2.8への移行厂肠补濒补2.8への移行
厂肠补濒补2.8への移行
guest5f4320
?
厂肠补濒补2.8への移行
厂肠补濒补2.8への移行厂肠补濒补2.8への移行
厂肠补濒补2.8への移行
Takeda Hiroyuki
?
Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7
Sea Mountain
?
奥辞谤诲笔谤别蝉蝉でオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
奥辞谤诲笔谤别蝉蝉でオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック奥辞谤诲笔谤别蝉蝉でオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
奥辞谤诲笔谤别蝉蝉でオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
Takashi Uemura
?
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
Masanori Kado
?
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
?
Capistrano
CapistranoCapistrano
Capistrano
Yasuharu Fukuda
?
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
Akabane Hiroyuki
?
Ruby on Rails Tutorial
Ruby on Rails TutorialRuby on Rails Tutorial
Ruby on Rails Tutorial
Ken Iiboshi
?
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
Y Watanabe
?
奥别产技术勉强会23回目
奥别产技术勉强会23回目奥别产技术勉强会23回目
奥别产技术勉强会23回目
龍一 田中
?
搁补颈濒蝉3.1谤肠4を试してみた
搁补颈濒蝉3.1谤肠4を试してみた搁补颈濒蝉3.1谤肠4を试してみた
搁补颈濒蝉3.1谤肠4を试してみた
Takahiro Hidaka
?
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
kenjis
?
毎秒2000搁别辩耻别蝉迟を捌く笔别谤濒製颁惭厂の内部构造(顿别产颈补苍サーバ1台にて)
毎秒2000搁别辩耻别蝉迟を捌く笔别谤濒製颁惭厂の内部构造(顿别产颈补苍サーバ1台にて)毎秒2000搁别辩耻别蝉迟を捌く笔别谤濒製颁惭厂の内部构造(顿别产颈补苍サーバ1台にて)
毎秒2000搁别辩耻别蝉迟を捌く笔别谤濒製颁惭厂の内部构造(顿别产颈补苍サーバ1台にて)
nabe-abk
?
Rails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3editionRails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3edition
Satomi Tsujita
?
惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる
惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる
惭辞箩辞濒颈肠颈辞耻蝉をウェブ制作现场で使ってみてる
jamadam
?
11 word pressカスタマイズ(テーマ編)
11 word pressカスタマイズ(テーマ編)11 word pressカスタマイズ(テーマ編)
11 word pressカスタマイズ(テーマ編)
文樹 高橋
?
厂肠补濒补2.8への移行
厂肠补濒补2.8への移行厂肠补濒补2.8への移行
厂肠补濒补2.8への移行
guest5f4320
?
厂肠补濒补2.8への移行
厂肠补濒补2.8への移行厂肠补濒补2.8への移行
厂肠补濒补2.8への移行
Takeda Hiroyuki
?
Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7
Sea Mountain
?
奥辞谤诲笔谤别蝉蝉でオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
奥辞谤诲笔谤别蝉蝉でオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック奥辞谤诲笔谤别蝉蝉でオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
奥辞谤诲笔谤别蝉蝉でオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
Takashi Uemura
?
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
Masanori Kado
?
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
?
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
Akabane Hiroyuki
?

More from Toru Yamaguchi (19)

これからの Microservices
これからの Microservicesこれからの Microservices
これからの Microservices
Toru Yamaguchi
?
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
Toru Yamaguchi
?
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
Toru Yamaguchi
?
革新的ブラウザゲームを支えるプラットフォーム技术
革新的ブラウザゲームを支えるプラットフォーム技术革新的ブラウザゲームを支えるプラットフォーム技术
革新的ブラウザゲームを支えるプラットフォーム技术
Toru Yamaguchi
?
技术选択とアーキテクトの役割 (要約版)
技术选択とアーキテクトの役割 (要約版)技术选択とアーキテクトの役割 (要約版)
技术选択とアーキテクトの役割 (要約版)
Toru Yamaguchi
?
技术选択とアーキテクトの役割
技术选択とアーキテクトの役割技术选択とアーキテクトの役割
技术选択とアーキテクトの役割
Toru Yamaguchi
?
How to bake delicious cookie (RESTful Meetup #03)
How to bake delicious cookie (RESTful Meetup #03)How to bake delicious cookie (RESTful Meetup #03)
How to bake delicious cookie (RESTful Meetup #03)
Toru Yamaguchi
?
Yapc asia 2011_zigorou
Yapc asia 2011_zigorouYapc asia 2011_zigorou
Yapc asia 2011_zigorou
Toru Yamaguchi
?
ngCore engine for mobage platform
ngCore engine for mobage platformngCore engine for mobage platform
ngCore engine for mobage platform
Toru Yamaguchi
?
mbga Open Platform and Perl
mbga Open Platform and Perlmbga Open Platform and Perl
mbga Open Platform and Perl
Toru Yamaguchi
?
Introduction OpenID Authentication 2.0 Revival
Introduction OpenID Authentication 2.0 RevivalIntroduction OpenID Authentication 2.0 Revival
Introduction OpenID Authentication 2.0 Revival
Toru Yamaguchi
?
OpenID Mobile ProfileOpenID Mobile Profile
OpenID Mobile Profile
Toru Yamaguchi
?
Introduction OpenID Authentication 2.0
Introduction OpenID Authentication 2.0Introduction OpenID Authentication 2.0
Introduction OpenID Authentication 2.0
Toru Yamaguchi
?
OpenID 2009
OpenID 2009OpenID 2009
OpenID 2009
Toru Yamaguchi
?
Mobile Openid
Mobile OpenidMobile Openid
Mobile Openid
Toru Yamaguchi
?
Client Side Cache
Client Side CacheClient Side Cache
Client Side Cache
Toru Yamaguchi
?
The Security of OpenID Authentication 2.0
The Security of OpenID Authentication 2.0The Security of OpenID Authentication 2.0
The Security of OpenID Authentication 2.0
Toru Yamaguchi
?
Yadis/XRI and OpenID
Yadis/XRI and OpenIDYadis/XRI and OpenID
Yadis/XRI and OpenID
Toru Yamaguchi
?
OpenID 2.0 Quick Note
OpenID 2.0 Quick NoteOpenID 2.0 Quick Note
OpenID 2.0 Quick Note
Toru Yamaguchi
?
これからの Microservices
これからの Microservicesこれからの Microservices
これからの Microservices
Toru Yamaguchi
?
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
Toru Yamaguchi
?
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
Toru Yamaguchi
?
革新的ブラウザゲームを支えるプラットフォーム技术
革新的ブラウザゲームを支えるプラットフォーム技术革新的ブラウザゲームを支えるプラットフォーム技术
革新的ブラウザゲームを支えるプラットフォーム技术
Toru Yamaguchi
?
技术选択とアーキテクトの役割 (要約版)
技术选択とアーキテクトの役割 (要約版)技术选択とアーキテクトの役割 (要約版)
技术选択とアーキテクトの役割 (要約版)
Toru Yamaguchi
?
技术选択とアーキテクトの役割
技术选択とアーキテクトの役割技术选択とアーキテクトの役割
技术选択とアーキテクトの役割
Toru Yamaguchi
?
How to bake delicious cookie (RESTful Meetup #03)
How to bake delicious cookie (RESTful Meetup #03)How to bake delicious cookie (RESTful Meetup #03)
How to bake delicious cookie (RESTful Meetup #03)
Toru Yamaguchi
?
ngCore engine for mobage platform
ngCore engine for mobage platformngCore engine for mobage platform
ngCore engine for mobage platform
Toru Yamaguchi
?
mbga Open Platform and Perl
mbga Open Platform and Perlmbga Open Platform and Perl
mbga Open Platform and Perl
Toru Yamaguchi
?
Introduction OpenID Authentication 2.0 Revival
Introduction OpenID Authentication 2.0 RevivalIntroduction OpenID Authentication 2.0 Revival
Introduction OpenID Authentication 2.0 Revival
Toru Yamaguchi
?
OpenID Mobile ProfileOpenID Mobile Profile
OpenID Mobile Profile
Toru Yamaguchi
?
Introduction OpenID Authentication 2.0
Introduction OpenID Authentication 2.0Introduction OpenID Authentication 2.0
Introduction OpenID Authentication 2.0
Toru Yamaguchi
?
The Security of OpenID Authentication 2.0
The Security of OpenID Authentication 2.0The Security of OpenID Authentication 2.0
The Security of OpenID Authentication 2.0
Toru Yamaguchi
?

Recently uploaded (6)

自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨
自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨
自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨
sugiuralab
?
量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果
量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果
量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果
info819904
?
2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿
2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿
2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿
翔栄 杉田
?
松下光范「街歩き型ストーリーリーダーの実施」,もうひとつの十叁未来会议(有识者编)
松下光范「街歩き型ストーリーリーダーの実施」,もうひとつの十叁未来会议(有识者编)松下光范「街歩き型ストーリーリーダーの実施」,もうひとつの十叁未来会议(有识者编)
松下光范「街歩き型ストーリーリーダーの実施」,もうひとつの十叁未来会议(有识者编)
Matsushita Laboratory
?
鲍-22プログラミング?コンテスト提出资料「作品説明动画」制作のポイントをご绍介
鲍-22プログラミング?コンテスト提出资料「作品説明动画」制作のポイントをご绍介鲍-22プログラミング?コンテスト提出资料「作品説明动画」制作のポイントをご绍介
鲍-22プログラミング?コンテスト提出资料「作品説明动画」制作のポイントをご绍介
鲍-22プログラミング?コンテスト运営事务局
?
カスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージ
カスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージカスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージ
カスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージ
info819904
?
自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨
自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨
自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨
sugiuralab
?
量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果
量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果
量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果
info819904
?
2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿
2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿
2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿
翔栄 杉田
?
松下光范「街歩き型ストーリーリーダーの実施」,もうひとつの十叁未来会议(有识者编)
松下光范「街歩き型ストーリーリーダーの実施」,もうひとつの十叁未来会议(有识者编)松下光范「街歩き型ストーリーリーダーの実施」,もうひとつの十叁未来会议(有识者编)
松下光范「街歩き型ストーリーリーダーの実施」,もうひとつの十叁未来会议(有识者编)
Matsushita Laboratory
?
カスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージ
カスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージカスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージ
カスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージ
info819904
?

Customization of DBIC::Schema::Loader

  • 1. Customization DBIC::Schema::Loader d:id:ZIGOROu Toru Yamaguchi <zigorou@cpan.org>
  • 2. Agenda DBIC::Schema::Loader のおさらい make_schema_at() 生成されたファイル自体に拡張 inc パスの追加による拡張 really_erase_files の値 Schema クラスも拡張対象にする DBIC::Schema::Loader を改造 DBIC::Schema::Loader の概要 名前に制約をつけてリレーション設定 まとめ
  • 3. make_schema_at() DBIC::Schema::Loader のメソッド 引数 1. schema クラス名 2. 生成オプション (HAShref) 3. connect_info (ARRAYREF) 基本系 #!/usr/bin/perl use FindBin; use File::Spec; use DBIx::Class::Schema::Loader qw(make_schema_at) ; make_schema_at( 'MyApp::DBIC::Schema' , { dump_directory => File::Spec->catfile( $FindBin::Bin , '..' , 'lib' ), relly_erase_files => 1 , }, [ 'dbi:mysql:database=dbictest' , 'root' ], );
  • 4. 拡張 (1) ファイル直書き方式 - 1 生成されたファイルに拡張 生成された Schema, Table クラスそれぞれの下の方に “ DO NOT MODIFY THIS ” と書かれたコメントがある そこから “ You can replace this text ” の領域は拡張領域で自動生成の対象ではない 生成されたファイルに直接書いて良い 追加で load_components() したりとか あるいは他のプラグインのメソッド叩いたり テーブル定義をゴニョゴニョしたりとか
  • 5. 拡張 (1) ファイル直書き方式 - 2 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:WFbbTfTFDFr/kewSj3QwAw package MyApp::DBIC::Schema; __PACKAGE__->load_components( qw/+MyApp::DBIC::MyComp/ ); __PACKAGE__->init_mycomp; # You can replace this text with custom content, and it will be preserved on regeneration 1 ;
  • 6. 拡張 (2) incにあるテンプレ読み込み方式 - 1 incパスに通したテンプレからinclude use libで適当なディレクトリにパスを通すと、そこにあるファイルを対応するモジュールの拡張領域に差し込んでくれる機能 ここで注意しないとダメなのはSchemaクラスは対象外 Tableクラスのみ拡張可能 ちなみに拡張領域の箇所はファイル直書き方式と同じ
  • 7. 拡張 (2) incにあるテンプレ読み込み方式 - 2 ディレクトリ構成 lib MyApp DBIC Schema User.pm schema MyApp DBIC Schema User.pm 自動生成される領域 Include ( ファイルの下部にくっつく )
  • 8. make_schema_at() [2] really_erase_files ( 生成オプション ) true の時 毎回ファイルを消して生成する Schema, Table クラス両方消しちゃうので、 ファイル直書き方式は使えない >< 必然的に include になるが、 Schema に対しては適用出来ない false の時 毎回ファイルを消さない 直書き方式が使える 但し消さないと include で挿入されたブロックが次回の直書きと見なされ、再び include されるので重複コードになるwww
  • 9. ここまでのまとめ 現在の問題点 Schema, Table 共に後付的に拡張したい Schema も対象にするなら really_erase_files を false にする そうすると直書き領域に make_schema_at する度に重複するコードが出来てしまう どうすれば良いか really_erase_files => 0 でも自分で Table クラスを消せば同じ事になる 拡張は Schema は直書き、 Table は include でやる。
  • 10. 改良版Schema生成 改良版 #!/usr/bin/perl use strict ; use warnings ; use FindBin; use File::Spec; use lib ( File::Spec->catfile( $FindBin::Bin , qw/.. lib/ ), File::Spec->catfile( $FindBin::Bin , qw/.. schema/ ) ); use DBIx::Class::Schema::Loader qw(make_schema_at) ; die unless @ARGV ; my $schema_class = 'MyClass::DBIC::Schema' ; # こんな感じで自分で消す unlink ( glob ( File::Spec->catdir( $FindBin::Bin , '..' , 'lib' , split ( / :: / , $schema_class ) ) . '/*.pm' ) ); make_schema_at( $schema_class , { components => [ qw/ResultSetManager UTF8Columns InflateColumn::DateTime TimeStamp/ ], dump_directory => File::Spec->catfile( $FindBin::Bin , qw/.. lib/ ), debug => 0 , really_erase_my_files => 0 , }, \@ARGV );
  • 11. さらなる改良 Schema::Loader について 中で何やってるか理解すればもっとカスタマイズ出来そう 特にリレーションとか通常の使い方では手出しできない部分を何とかしたい まずはクラス図から
  • 12. Class::Diagram of DBIC::Schema::Loader Class Diagram DBIC::Schema::Loader DBIC::Schema ::Loader::Base DBIC::Schema ::Loader::Base::DBI::mysql DBIC::Schema ::Loader::RelBuilder 各ドライバごとにクラスがある リレーションの構築 Dump 時のオプションの詳細
  • 13. RelationShip [1] belongs_to とか has_many とか belongs_to(“user_id”, ...) $rs-> user_id -> user_id ダサすぎ 残念ながら現在はこうなる belongs_to(“user”, ...) $rs-> user -> user_id $rs-> user_id も OK 自然になる こうしたい
  • 14. RelationShip [2] 問題の箇所 DBIC::Schema::Loader::Base の _load_relationship() foreach my $src_class ( sort keys %$rel_stmts ) { my $src_stmts = $rel_stmts ->{ $src_class }; foreach my $stmt ( @$src_stmts ) { ### ここら辺を書き換えちゃえば良い $self ->_dbic_stmt( $src_class , $stmt ->{method}, ## belongs_to とか @{ $stmt ->{args}} ## belongs_to の引数リスト ); } }
  • 15. RelationShip [4] 改良版 foreach my $src_class ( sort keys %$rel_stmts ) { my $src_stmts = $rel_stmts ->{ $src_class }; foreach my $stmt ( @$src_stmts ) { ### belongs_to の時だけ無茶する if ( $stmt ->{method} eq 'belongs_to' ) { my $table_class_suffix = [ split / :: / => $stmt ->{args}->[ 1 ] ]->[ -1 ]; $stmt ->{args}->[ 0 ] = String::CamelCase::decamelize( $table_class_suffix ); } $self ->_dbic_stmt( $src_class , $stmt ->{method}, @{ $stmt ->{args} } ); } }
  • 16. まとめ Schema::Loader との付き合いかた really_erase_files を false でも自分で Table 消す Schema は直書き、 Table は include で辻褄合わせる belongs_to は問題箇所を redifine する 名前でコード生成時の制約をつけるのは良さそう。 on_created, on_updated(DATETIME) で NOW() 相当とか 時間の都合上割愛したけど、それ以上は自分で DBIC 流儀のプラグイン書く ( 割と便利 ) そこまでするなら自分で Loader 書くべき?(ぇ あるいは DBIC を使わない