読者です 読者をやめる 読者になる 読者になる

Re:Start

いまはディレクターやってます

オフライン生活 3日目

今日も今日とて、RoR。楽しくて仕方ないってこういうことを言うんだろか。
深夜に、やっと次のwifi届けるよmailが来たので、今日が最後のオフラインとなるわけだー。

p245~

SQL[アソシエーション]

  • join でつなぐこともできるが、railsはあくまでアソシエーションでつなぐこと
  • その際にはModelへの記述はもちろん、migrateするときのCREATE文も一工夫必要(falseにしたり、timestamp削ったりとか)

コールバック

  • トリガーみたいなことができる

オブザーバ

  • 設定ファイルで実行するかどうかを着脱できる
  • 作成する場合は、コマンドで行う
$ rails generate observer Book
  • Modelフォルダ内に作成された _observer.rb に追記する
  • config/environments/development.rb にobserverの設定をする
  • 複数モデルを監視したい場合は、observe メソッド内に記述する(別のモデルを見ている事は明示的にね!)

マイグレーション

  • いつでも戻せるような状態であることも大事、その処理を書くのがmigration
  • 自動生成されたキーは、モデル側では記述する必要がある
  • ただ、サンプルでは、self.upメソッドとself.downメソッドが掲載されてるんだけど、現時点ではchangeメソッドが自動生成されるんだよね。内容はself.upメソッドに記述されてるものと同じなんだけれども。
  • DBに追加したい場合は、単独で rails generate migration コマンドを実行する。TDL文の切り出し?
  • 使用した名前であらかたメソッドが追加されてる! add_birth_to_authors だと authors テーブルに対して、 birth 項目が追加されるようなメソッドの内容になってる!!
  • 手で実行する場合は、migrationで作成されたものと同等のものを自分でこさえなければいけないので、手間がかかるし、オススメしませんよぅ
  • マイグレーション関係のrakeコマンドには、rollback, up, down, redo, resetなどがあり、いつのバージョンとか、いくつ前の状態にとか移動できるようになってる。
  • マイグレーションした全ての内容は、schema.rbに登録されているので、似たようなDB環境を複製したい場合等はschema.rbを使用するのがbest
  • データを入れる時はseeds.rbのようにして、rubyのスクリプトファイルで実行する場合と、fixture(YAML形式)で記入したデータを作成する場合とある
    • fixtureは、スクリプトブロックを埋め込むこともできるので、大量のテストデータをぶちこむことも簡単にできる
  • rails generate コマンドはカスタマイズできる
    • テンプレート一式をアプリケーションにコピーして、それを更新するだけ!
  • アップロード
    • フォルダにupするのは結構簡単にできる
    • バイナリとしてテーブルに保存するのは、ちょっとロジック自体がイケテナイのもあり、手間取った。結果、 ActiveModel::MassAssignmentSecurity::Error が出たので諦め...(net復帰次第)
  • 形式変換
    • xml, json, textへの自由な出力がさらりとできる!はずなんだが、ここではDBの項目が存在しないよエラーになってしまう。もしかしたら、関連させてるところで失敗した可能性もある。bookidってなんやー!!
    • erbだけではない。xmlにはbuilder, JSにはrjsなど、それぞれ特化したものを利用できる。利用するとより記述するコード量が少なくてすむ
    • やっぱり関連がうまくいってないようで、他のところでもそんなカラムないよエラーが出ちゃうわ。
      • 仕方なくDBを全て入れ直してみた。結果的に、ひとつテーブルが間違ってたり、うまく機能するようになった部分もある。だって別のエラーに進んだのだから。でも、今度は、authorにnameなんてメソッドはないと言われてしまうから、またアソシエーション問題なんだよ。

思った事

  • if文の中などでそれぞれメッセージを設定して終わりで返すようなロジックがあったときに、今までは、分岐条件に入る前に定義しなきゃいけなかったのに、rubyだと中に定義したものをそのまま使える。逆に、何も入らなかった場合はもちろんnilになるんだろうけど。ここがちょっと慣れない、かなぁ。