Rails4 | 新規・変更機能 | NullRelationの追加
概要
Rails4では ActiveRecord に NullRelation が追加された。
任意の条件の時だけ空の結果を返したい場合など、通常の結果が返却された場合と同様に
メソッドチェインを利用できる。(最終的には空値が返却される)
いわゆる、 Null Object Pattern 。
none を利用した際は、SQLが発行されないためパフォーマンスの意味でも好ましいです。
サンプル
仕様
- 下記で scaffold した状態をベースとする
rails g scaffold person name:string age:integer
rake db:migrate
- index へのリクエスト時に Query String に disable キーがあれば none を。なければ all を返却する。
- Person の name には敬称 san を付与する。
サンプルコード
- scaffold した状態の PeopleController の index メソッドを下記のように変更します
def index
@people = params['disable'] ? Person.none : Person.all
logger.info "params['disable'] = #{!!params['disable']}"
logger.info "@people = #{@people.class}"
@people = @people.map { |person| person['name'] += ' san';person }
end
all 呼び出し時
- http://xxxxx:3000/people をリクエスト時
ログは以下のようになります
params['disable'] = false
@person = Person::ActiveRecord_Relation
Person Load (0.6ms) SELECT "people".* FROM "people" ORDER BY "people"."id" ASC LIMIT 1
画面には以下のようなレコードが表示されます
tanaka san 24 Show Edit Destroy
suzuki san 25 Show Edit Destroy
none 呼び出し時
ログは以下のようになります。
params['disable'] = true
@people = Person::ActiveRecord_Relation
SQLを実行していないため、SQLのログが出力されていません。
画面にはレコードが表示されません。