named_scopeがインスタンス生成時にも使えるようになった
July 23rd, 2008
ちょっと前の話だが、 こちらのコミット にて、hashで条件指定された named_scopeを経由してモデルのインスタンス生成を行った場合、その条件の値があらかじめセットされたインスタンスが作られるようになった(この件については、 こちら の「注目の未解決チケットたち」に書いたとおり以前から 要望が挙がっていた もの)。
どういうことかというと、例えばこんな感じ。
こんなようなmodelがあるとして、
class User < ActiveRecord::Base belongs_to :prefecture # 引数を取らない named_scope Prefecture.all.each do |prefecture| named_scope "lives_in_#{prefecture.name.downcase}".to_sym, :conditions => {:prefecture_id => prefecture.id} end # 引数を取る named_scope named_scope :name_is, Proc.new {|name| {:conditions => {:name => name}}} named_scope :aged, Proc.new {|age| {:conditions => {:age => age}}} end |
まずはふつうに検索。
User.lives_in_tokyo.name_is('Matsuda').aged(16) |
発行されるSQL
User Load (0.000373) SELECT * FROM "users" WHERE ((("users"."age" = 16) AND ("users"."name" = 'Matsuda')) AND ("users"."prefecture_id" = 13)) |
ここまでは今までどおり。
これを newとか createとかにつなげるとこうなるッ!
user = User.lives_in_tokyo.name_is('Matsuda').aged(16).create |
実行結果
User Create (0.001407) INSERT INTO "users" ("name", "created_at", "updated_at", "age", "prefecture_id") VALUES('Matsuda', '2008-07-23 18:09:27', '2008-07-23 18:09:27', 16, 13) #=> #<User id: 1, name: "Matsuda", age: 16, prefecture_id: 13, created_at: "2008-07-23 18:09:27", updated_at: "2008-07-23 18:09:27"> |
かっこいー!



Sorry, comments are closed for this article.