2017.09 «  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 - - - - » 2017.11
TOP > Rails 2.1・その6(named_scope がアツい)

 ← Rails 2.1・その7(mysql で整数の型を切り替えてくれる) | TOP | Rails 2.1・その5(model の値変更を覚えている)

スポンサーサイト 

--年--月--日 (--)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


【広告】

[--.--.--(--) --:--] スポンサー広告 | Trackback(-) | Comment(-)
↑TOPへ

Rails 2.1・その6(named_scope がアツい) 

2008年05月29日 ()
Special Thanks to a_matsudaさん
-------------------------------------------
controller とかで、:conditions => { ....
とか書いてソースコードがややぐちゃぐちゃになるのを見事にスッキリさせられるようになりました。

早速例を見てみましょう。model クラスに、named_scope の行を追加します。

class Person < ActiveRecord::Base
  named_scope :young, :conditions => {:age => 0..30}
end



これで、age が 0 ~ 30 の人をゲットできるようになります。

Person.young

SELECT * FROM "people" WHERE ("people"."age" BETWEEN 0 AND 30)



その人数をカウントしてくれたりもします。

Person.young.count

SELECT count(*) AS count_all FROM "people" WHERE ("people"."age" BETWEEN 0 AND 30)



named_scope は、複数指定することもできますよ。

class Person < ActiveRecord::Base
  named_scope :young, :conditions => {:age => 0..30}
  named_scope :recent, lambda { {:conditions => ["updated_at > ?", 1.day.ago]} }
end



この :recent ですが、ちょっとわかりづらいのですが、こういう↓変遷をたどりました。

# これだと、リアルタイムの1.day.agoではなく、モデルがインスタンス化された時の1.day.agoがずーっと同じまま残ってしまう
named_scope :recent, :conditions => ["updated_at > ?", 1.day.ago]
# カッコをつけて
named_scope :recent, {:conditions => ["updated_at > ?", 1.day.ago]}
# これが最終形。これだと、:recent が呼び出されるたびに 1.day.ago の値がリアルタイムに変化する
named_scope :recent, lambda { {:conditions => ["updated_at > ?", 1.day.ago]} }



さて本題にもどりますと、:young と :recent を組み合わせることもできます。そうすると、SQL的にはANDでつながるようです。

Person.young.recent

SELECT * FROM "people" WHERE ((updated_at > '2008-05-28 10:55:27') AND ("people"."age" BETWEEN 0 AND 30))



さらに引数を取ってみることもできますよ。
次の例は、引数を取ることもできるし取らなかったら1.day.agoを使う例です。イキナリ複雑でゴメンくさい。

class Person < ActiveRecord::Base
  named_scope :recent, lambda {|*args| {:conditions => ["updated_at > ?", args.first || 1.day.ago]} }
end



これを使って

Person.recent(6.days.ago).count


とか出来ちゃいまーす


最後に、named_scope を使わないでも似たようなことができるのでご紹介します

young = Person.scoped(:conditions => {:age => 0..30})
young

SELECT * FROM "people" WHERE ("people"."age" BETWEEN 0 AND 30)



きゃべつ太郎ブンダバー

参考ブログ
named_scope
What's New in Edge Rails: Has Finder Functionality


【広告】

[2008.05.29(Thu) 11:47] [2.1]active_recordTrackback(0) | Comments(0)
↑TOPへ

 ← Rails 2.1・その7(mysql で整数の型を切り替えてくれる) | TOP | Rails 2.1・その5(model の値変更を覚えている)

COMMENT

COMMENT POST















管理者にだけ表示

 ← Rails 2.1・その7(mysql で整数の型を切り替えてくれる) | TOP | Rails 2.1・その5(model の値変更を覚えている)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。