『Ruby on Rails5 アプリケーションプログラミング』学習日誌 3

前書き

今日は第5章モデルについて学習していきたいと思います。
ソースコードにもコメントで気づいたことについて注釈入れてます。

ページ範囲

p.200-229

ポイントまとめ

ActiveRecord::Relation

この章について考えるにあたって前提となるActiveRecord::Relation
について知りたい。ActiveRecordrailsが標準のO/Rマッパー。O/Rマッパーとはobjectとrelational dbの橋渡しをするためのライブラリ。ActiveRecordがリレーショナルモデルであるdbをオブジェクト化してくれることによってそれぞれのレコードをカラム(属性)によるプロパティを持つオブジェクトとして扱うことができる。ActiveRecordがどこから来たのかというとまず、各モデルはApplicationRecordを継承している。そしてこのApplicationRecord
はmodels/application_record.rbで ActiveRecord::Baseを継承している。なので各モデルとそのインスタンスActiveRecordのメソッドを使うことができる。findメソッドやクエリメソッドなどもActiveRecordのメソッドである。下記のようにクエリメソッドはその場でdbにアクセスせず、ActiveRecord::Relationのオブジェクトを返す。そのオブジェクトにさらにクエリメソッドを実行させて、メソッドチェーンを作ることができる。メソッドチェーンを作った場合、合体した条件式を戻り値として返すが、オブジェクトそれ自体は変化しない。想像だと、それぞれのオブジェクトがクエリを生成するメソッドを内部的に持っている。そしてそのメソッドはデータのもつ属性に依っているのでorメソッドなどでActiveRecord::Relationのオブジェクト同士を結合する際にはモデルによる互換性がないといけない。

データ取得の方法ークエリメソッド

railsにはwhere, selectなどのクエリメソッドと呼ばれるメソッドが用意されている。
これらのfindやfind_by, allなどのメソッドとの違いはそれが読まれた時点でデータベースにアクセスしないという点。クエリメソッドの場合はそれが読まれた時点ではActiveRecord::Relationのオブジェクトが生成されてそれがviewなどで実行される時点で初めてまとめてクエリとなってdbにアクセスするイメージ。このようにコードが読まれる時点(オブジェクト化)とdb接続のタイミングがずれていることを遅延ロードと呼ぶ。これによってクエリメソッドを繋げて、簡単に複雑なクエリを作ることができる。このような記法のことをメソッドチェーンと呼ぶ。

RESTfulインターフェイスとは?

RESTとはhttpメソッドを使ってurlで表現されているリソースを操作する方法のことで、RESTfulインターフェイスとはRESTを前提としたルーティングのことである。railsではこのRESTfulインターフェイスを前提とした機能設計がなされているためこれを活用するのが効率が良いとされる。

httpメソッド
  • GET 取得
  • POST 作成
  • PATCH 更新
  • DELETE 削除

RESTfulインターフェイスの定義方法

resourcesメソッドは引数を各リソースとする。リソースとはdbにあるデータなどのことでモデルに対応させて表現する。resources :users など。この一行だけで汎用性の高いルートがたくさん生成される。rails routesコマンドでどんなルートが定義されているのか確認できる。RESTfulインターフェイスを実現するにはルートによってhttpメソッドやurlパターンを定義しなければならない。それがあて初めてルートを通ることができ、ルートの先でparamsメソッドによって値を受け取ることができる。またparamsの引数はリクエスト情報の属性とするが、これはルートで定義するか、もしくはフォームでpostされた際のidかname?どちらかよくわからないけどどっちかを参照してvalueを受け取るようになっている。

感想

特になし