on Rails : 第5回Rails勉強会@関西

ちょっとした個人的なまとめ.録音したい.だれかポッドキャストしてくれないかな.他力本願過ぎて泣ける.

アジャイルにデータモデリング

  • 業務システムに使用するには,Railsには不十分なとこがあるよね
  • 業務システムはこーゆーもんだからこーゆー風に改善して欲しいな,みたいな
業務システムの典型
  • 財務システム
  • 人事・給与システム
  • 営業管理システム

これで企業が出来てる感じ.上の2つは,ほとんどの企業がパッケージで入れてる.問題は,「営業管理システム」.コレをうまく作ると,事業の足を引っ張らない,その程度でしかない!(事業がウマくいって売り上げが上がるとかではない.)
具体的には,販売管理システム,生産管理システム,契約管理システムetc...こういうものを,事業を問わず,事業を支援するものとして営業管理システムがある.
営業管理システムの,OSやゲームなどのソフトウェア開発と違いは,以下のような事が上げられる.

  • DBが中心
  • 社会的な広がり
業務システム三つのキーワード
  1. 簿記(これがわかんないと,業務システムの世界に入っちゃ行けない)
  2. モデリング
  3. 個々の業務知識

簿記はまぁ3級で良い.2級は別に要らん.SEがしなくて良いような,馬鹿馬鹿しい事までしないといけない:p財務システムとのインタフェースがわかってないと,何もできない.だから,簿記とか会計システムの構造を学ばないといけない.

モデリング
  • データベース
  • アプリケーション
  • ユーザ

それぞれのあり方をモデリングしないといけない.今回は,その中でデータベースに関することの話です.業務システム→営業管理システム→モデリング→データベース.

XEAD

XEADで検索すれば,いろいろでてくる.その中の,コンセプトウェア.コンセプトウェア財務管理.
やばい,どんどん話がわからなくなってきた.
デカイものを作る時,モデリングの技術を駆使しないと訳が分かんなくなる.何はともあれ,画面がスゴいことになってたけど.XEAD,タダでダウンロードできるんだけど,その前に簿記を勉強した方が良いよ.

論理と実装

モデリング=論理設計.実装は,物理制約と論理要件の両方の影響を受ける.

  • データ構成
  • 機能構成
  • 業務構成

それぞれにおいて,論理制約にはモデルが,物理制約にはそれぞれ

  • データ構成:ストレージ技術,DBMS
  • 機能構成:PGM言語,実装技術,通信技術
  • 業務構成:社風,評価制度,実組織

が存在し,それぞれの実装がそれぞれの制約の影響を受ける.
最外殻には業務モデルが,その内側に機能モデル,中心にデータモデルが存在し,レイヤーになってるイメージ.業務モデルからデータモデルは直接参照できない感じ.

関数従属性

懐かしい言葉!って前期にじっくり勉強したばかりだよ.
例)会員Noがわかれば会員名がわかる.しかし,会員名から会員Noが求められるとは限らない.
会員名 = f(会員No) = テーブルTの会員Noを持つ,会員名の値
これぞRDB

f(a) = b,a → b
bはaに関数従属する.

  • a:識別子
  • b:従属子

てゆーか,だいたいが授業の復習だな.参照関係とか多重度とか.さすがにわかる.そして,図ばっかりだから,ちょっと書けない.

ActiveRecordておかしいぞ

複合キーが使えないっちゅうのは勿体ない.それと,やっぱり多対多の関係は気持ち悪い.
1:1ってのも不安定.でも,外部キー使っちゃえば良いんじゃネーノ?

Rails Chat

Rails本体にはそんなに関係無いそうで.Rails Chatで検索すればわかる.
Juggernautの説明

  • by Alexくん16歳.すげぇ.
  • Flash Socket plugin
  • Flash XMLSocketを用いたリアルタイム通信
タイガーバームクーヘン

artonさんがそれをゴニョゴニョ→Tigerbaumkuchen
ジャガーノートは名前がカッコいいけど中身があんまり→タイガーバームクーヘンは名前がアレだけど中身がカッチリ.
Rails pluginとして配布.
ジャガーノートのあまり嬉しくない点を改良!

  • ping/pong:自動切断対策
  • クライアント単位の送信用スレッド:安定性を向上
  • メッセージの追い抜きを防止
Rails Chatの開発

オフレコモードや過去ログがあったりする.すげぇ.コードを書き込むと,そのコードがダウンロードができたりして便利そう!

Rails Chatの動作原理

Rails ChatはPush ServerとRailsで動いてる.クライアントはFlashJavaScriptで.
FlashとPush Serverが通信し,FlashJavaScriptを呼びにいく.新しいユーザがやってきたことをJavaScriptRailsに教えて,RailsがPush Serverに新しいユーザがやってきたことを教える.で,Push ServerがクライアントのFlashに新しいユーザのことを一斉配信する.
ぐるぐる回る感じだな〜.


このシステムのキモは,クライアントのFlashとPush Serverのコネクションが維持され続けるってこと.HTTPって感じじゃないな.

Rails 初心者レッスン第2回 - ActiveRecord入門

配布されたレジュメは,はじめようRoRのAR的内容.何だかんだでよくできているAR.モデルが単数系,テーブルは複数形っていう規約,Personに対しPeopleに,Mouseに対しMiceなるのは,何かしらそういうテーブルがあるようです.以下Tips.

createとnew

なんというか,わかる気がする.そんな気がする.

find
  • idで検索してヒットしなければ例外
  • firstで検索してヒットしなければnil
  • allで検索してヒットしなければ[]

idで検索してヒットしなければ例外か,begin-rescueでエラーメッセージをブラウザに表示しないようにしないと,ちょっと恥ずかしいよな.nilが返ってくるのも同様に,nilクラスにメソッドが無いよエラーが出ないようにしないと,こちらも恥ずかしい.まぁその辺はnil?を使えば良いよな.[]にしても同じだ.empty?を使えば良い.

find_by_hoge

これは良くできてると思う.find_by_name_and_emailとか,動的にメソッドを生成しているのかな.ARすげーな.

update
hoge = Hoge.find(1)
hoge.fuga = 'piyo' # まだ変更されない
hoge.save          # ここで変更される

findでインスタンスを作成し,値を変更しただけではテーブルは更新はされない.値の変更と同時にテーブルを更新したい場合は,

Hoge.find(1).update_attribute(:fuga, 'piyo')

複数の値を同時に変更したい場合は,

Hoge.find(1).update_attributes(:fuga => 'piyo', :foo => 'bar')

とする.attribute's'で複数形なだけなのな.一応ハッシュで渡すことになっているので,厳密には

Hoge.find(1).update_attributes({:fuga => 'piyo', :foo => 'bar'})

としたほうが美しそうだ.

delete or destroy
  • destroy:まずインスタンスを作成し,そのインスタンスのdestroyメソッドを呼ぶ.before_saveなどのコールバックも呼ばれる→安全ってことかな.
  • delete:インスタンスを作成せずに削除.before_saveなどのコールバックが呼ばれない.

レジュメにはこんな感じに書かれているのだけれども,これはクラスメソッドの事だよな.インスタンスメソッドにdeleteは無いものな.

hoge = Hoge.find(1)
hoge.destroy # これで削除される
hoge.fuga = 'piyopiyo' # destroyしたインスタンスは変更できない何故なら
hoge.frozen?
=> true # 凍結されてるから.

かといって,freezeしても削除はできる.

>> dummy = Person.create(:name => 'dummy', :email => 'dumm')
>> dummy.freeze
>> dummy.destroy
>> Person.find(dummy.id)
ActiveRecord::RecordNotFound: Couldn't find Person with ID=3 # 以下略

destroyした所でインスタンスは変更されないからだろうな.インスタンスが変更されなくてもテーブルから消せさえすれば良いのだから.・・・これって脆弱性とかじゃ無いよね.


以上,ARでDRADでした.

総括

どの話題も大体は着いていけた.Rails Chatにしてもデータモデリングにしても,深い所までは分かんなかったけど.まぁニュアンスが掴めりゃ良いのですよ,たぶん.
これからは,「それってRailsでやる必要ある?」という問いかけに対し,YESと胸を張って言えるアプリケーションの作成が待たれるわけですが,まぁ頑張って模索していきたいのもです.あ,それから簿記をとろう!(遠い目)経験者曰く,半年も勉強すればとれるそうです.