ちょっと前の話だが、 こちらのコミット にて、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.