Rails4 | 新規・変更機能 | 名前付きscopeはlambda記法のみを許容
概要
Rails3以前では名前付き scope には2通りの記法がありました。
class SomeModel < ActiveRecord::Base
# lambdaを使わない記法
scope :scope_name, where('condition > 10')
default_scope where('condition > 20')
# lambdaを使う記法
scope :scope_name, -> { where('condition > 10') }
default_scope { where('condition > 10') }
end
Rails4では lambda記法 のみを許容します。
(実行タイミングの誤解を防ぐため)
サンプル
仕様
- 下記で scaffold した状態をベースとする
rails g scaffold person name:string age:integer
rake db:migrate
テーブルには以下のデータが登録されています
$ select * from people;
1|tanaka|20|2014-06-25 23:45:12.555117|2014-06-25 23:15:55.737728
2|suzuki|19|2014-06-25 23:45:30.476800|2014-06-25 23:15:50.489037
サンプルコード
- scaffold した状態の PeopleController の index メソッドを下記のように変更します
def index
case params['age_type']
when 'minority'
@people = Person.minority
when 'adult'
@people = Person.adult
else
@people = Person.all
end
end
- Personモデルに scope の設定を追加します
class Person < ActiveRecord::Base
scope :adult, -> { where('age >= 20') }
scope :minority, -> { where('age < 20') }
end
成人のデータをリクエストする
画面には以下のようなレコードが表示されます
tanaka 20 Show Edit Destroy
未成年のデータをリクエストする
画面には以下のようなレコードが表示されます
suzuki 19 Show Edit Destroy
成人・未成年をリクエスト
- http://xxxxx:3000/people をリクエスト時
画面には以下のようなレコードが表示されます。
tanaka 20 Show Edit Destroy
suzuki 19 Show Edit Destroy