SlideShare uma empresa Scribd logo
1 de 29
Baixar para ler offline
named_scopeに
ついてくわしく
(株)永和システムマネジメント ¦¦ Rails勉強会@東京
諸橋 恭介(もろはし きょうすけ)
k-morohashi@esm.co.jp (work)
moronatural@gmail.com (private)
What’s this?
• with_scopeで使っていた「スコープを掛けた」検索を、ク
ラスメソッドとして定義できるようになる仕組みです。
• ちょうどRails 2.0からwith_scope()がprotected(笑)に
なって困っていた人にとっての福音となりそうです。
• 定義したスコープは、都度実行されるわけでなく、
AssociationProxy的にレイジーに賢く実行されます。
• Rails 2.1の目玉機能でRubyKaigiで松田さんが話しました
http://www.slideshare.net/a_matsuda/
new-wave-of-database-programming-with-ruby-19-on-rails-21/
with_scopeってなんだっけ
Recipe 077 (p.220)
検索条件をスコープ毎に
まとめて定義する
http://www.amazon.co.jp/dp/4797336625
なにができるの?
• named_scope()で定義した「集合」を掛け合わせて
操作できます。
• RDBMSをOOPの世界に引っ張ってきたORMは偉大
ではありますが、その過程で集合演算という色合いは
薄れ、単なるSQL/RDBMSはオブジェクトの永続化
方法のように扱われてしまいがちです
• ORMを使うとSQL知らなくても。。。という言質が端的に示してい
ますね
• 集合演算を再び我が手に!! ということで
named_scope()の説明です。
Examples
active users
class User < ActiveRecord::Base
named_scope :active,
:condition=>["deleted = ?", false]
end
describe “activeなユーザ” do
it “は全員削除されて*いない*こと” do
User.active.should be_all{|u| not u.deleted }
end
end
active users
(with guideline)
class User < ActiveRecord::Base
named_scope(:active,
{:condition=>["deleted = ?", false]})
end
describe “activeなユーザ” do
it “は全員削除されて*いない*こと” do
User.active.should be_all{|u| not u.deleted }
end
end
hot n users
use scope with args
class User < ActiveRecord::Base
named_scope :active,
:condition=>["deleted = ?", false]
named_scope :hot,
Proc.new{|arg|
{:order =>"#{table_name}.popularity DESC",
:limit => arg}
}
end
describe “人気トップ3のユーザ” do
before do
@users = User.hot(3)
end
it "のうちトップはdahliaであること" do
@users.first.should == users(:dahlia)
end
end
hot n users
use scope with args
hot active users
crossover 2 scopes
describe "BAN! dahlia" do
before(:each) do
users(:dahlia).update_attribute(:deleted, true)
end
it "アクティブユーザで最も人気なのはcharlesであること" do
User.hot(3).active.first.should == users(:charles)
end
it "クエリ発行(select_all)は一回だけ呼ばれること" do
User.connection.should_receive(:select_all).once.and_return([])
User.hot(3).active.find(:all)
end
end
update using scope
class User < ActiveRecord::Base
named_scope :active,
:conditions=>["#{table_name}.deleted = ?", false] do
def ban
self.update_all(:deleted => true)
end
end
named_scope :hot,
Proc.new{|arg|
{:order =>"#{table_name}.popularity DESC",
:limit => arg}
}
end
update using scope
describe “User.active.ban” do
it "activeユーザ全員がBANされること" do
User.active.ban
User.should have(0).active
end
it "UPDATE文は一度だけ発行されること" do
User.connection.should_receive(:update).once
User.active.ban
end
end
Implementations
ActiveRecord::Baseへ
追加されるメソッド
•ActiveRecord::Base.scopes()
• 定義されているscopeを返す。 
inheritable_attributeで保持されてる。
•ActiveRecord::Base.named_scope()
• 第一引数にscope名,第二引数にHash形式でfind
パラメータを渡す
• 第二引数にfindパラメータを返すProcを渡すと実行
時に評価される。
named_scope宣言をkwsk
•named_scope宣言でscopeを定義する
• 内部では実行時にScopeオブジェクトを作るProc
を作る。
• それを呼び出すクラスメソッドも追加される。
• ブロック付きで呼び出すと無名モジュールを作って
Scopeオブジェクトに追加する
• このブロックは第二引数のProcオブジェクトとは
別物。このへんが1.9だとキレイだという所以。
AR::Base.named_scope
def named_scope(name, options = {}, &block)
scopes[name] = lambda do |parent_scope, *args|
Scope.new(parent_scope, case options
when Hash
options
when Proc
options.call(*args)
end, &block)
end
(class << self; self end).instance_eval do
define_method name do |*args|
scopes[name].call(self, *args)
end
end
end
Scopeオブジェクト
•ArrayのようでArrayじゃないアレ
• みんな大好きAssociationProxyと同じ感じ
• Arrayぽい動きはload_found()でロードしたモ
デルオブジェクトのArrayに委譲
• みんな大好きmethod_missingで頑張ってる
Scope.new(parent,options,&block)
• 第一引数は親スコープ
• Scopeインスタンス or AR::Base
• 最初は必ずAR::Base
• 第二引数がfindパラメータ
• ブロックを渡すとScopeオブジェクトのメソッ
ドを追加できる
‣ex => User.active.ban
Scope#method_missing
• method_missingで「親スコープ」を使う
• 呼ばれたメソッドに対応する名前付きscopeがあれば
子Scopeを作るProcをcallする
• 子Procには親スコープとしてselfを渡す
• なければ自身のfindパラメータを使って親スコープの当該
メソッドを呼び出す
Scope#method_missing
def method_missing(method, *args, &block)
if scopes.include?(method)
scopes[method].call(self, *args)
else
with_scope :find => proxy_options do
proxy_scope.send(method, *args, &block)
end
end
end
Conclusion
call sequence of
User.active.hot(3).each do |u|
do_something
end
call sequence
- generate Scope instance -
User#active
#=> <#Scope:active, @proxy_scope=>User>
<#Scope:active>#hot(3)
---> <#Scope:active>#method_missing(:hot)
# scope[:hot] != nilであるため
#=> <#Scope:hot, @proxy_scope=> <# Scope:active>>
call sequence
- execute and respond to method -
<#Scope:hot, @proxy_scope=> <#Scope:active>>#each
---> <#Scope:hot>#proxy_found
---> <#Scope:hot>#find(:all)
---> <#Scope:hot>method_missing(:find)
---> <#Scope:hot>#with_scope{ <#Scope:active>#find }
---> <#Scope:active>#method_missing(:find)
---> <#Scope:active>#with_scope{ User.find(:all) }
# => [<#User:..>, .... ]
[<#User:..>, ...].each{ do_something }
you.any?{|u|
u.question?
}
FAQ: スコープはどんなふ
うに結合されるの?
•後ろから順にwith_scopeを使います。
• WHERE句相当(:conditionsパラメータ)はANDで
結合されます。
• ORDERやLIMITは先に指定したscopeで指定して
いるものがそのまま使われるっぽいです。
• この辺りのロジックは activerecord-2.1.0/lib/
active_record/base.rb : 1807 あたりを参照
FAQ: Ruby 1.9だとより
カッコ良いという噂があるが?
• Procオブジェクト生成に->記法が使えます
named_scope :hot,
Proc.new{|arg|
{:order =>"popularity DESC",
:limit => arg}
}
named_scope :hot, ->{
{:order =>"popularity DESC",
:limit => arg}
}
旧
これが
こうなる
新
FAQ: テストがよりカッコ良く
書けるという噂があるが?
• mockするのが楽にキレイになりそうな感じ。
User.should_receive(:find).
with(:all,:condition=>[...]).
and_return( [alice] )
User.shold_receive(:active)
and_return( [alice] )
旧
これが
こうなる
新
ご清聴あり
がとうござ
いました

Mais conteúdo relacionado

Mais procurados

2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックスkeki3
 
Clojureによるログ収集と解析
Clojureによるログ収集と解析Clojureによるログ収集と解析
Clojureによるログ収集と解析Yoshitaka Kawashima
 
Cocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使うCocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使うMasayuki Nii
 
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Hiroshi Ito
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情takezoe
 
運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回Shigeharu Yamaoka
 
よろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだよろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだNarami Kiyokura
 
2018年度 若手技術者向け講座 インデックス
2018年度 若手技術者向け講座 インデックス2018年度 若手技術者向け講座 インデックス
2018年度 若手技術者向け講座 インデックスkeki3
 
"Hello World!" から始める Calc で LibreOffice Basic
"Hello World!" から始める Calc で LibreOffice Basic"Hello World!" から始める Calc で LibreOffice Basic
"Hello World!" から始める Calc で LibreOffice Basic78tch
 
Powershell基礎_20180521用
Powershell基礎_20180521用Powershell基礎_20180521用
Powershell基礎_20180521用Tetsu Yama
 
マクロでBASEを操作しよう BASE Let's operate with macros
 マクロでBASEを操作しよう  BASE Let's operate with macros マクロでBASEを操作しよう  BASE Let's operate with macros
マクロでBASEを操作しよう BASE Let's operate with macroskoutarou watanabe
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編takeuchi-tk
 
実践 Reactive Extensions
実践 Reactive Extensions実践 Reactive Extensions
実践 Reactive ExtensionsShin Ise
 
Androidで使えるJSON-Javaライブラリ
Androidで使えるJSON-JavaライブラリAndroidで使えるJSON-Javaライブラリ
Androidで使えるJSON-JavaライブラリYukiya Nakagawa
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in ScalaLintaro Ina
 
JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介Yusuke Hirao
 

Mais procurados (16)

2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス
 
Clojureによるログ収集と解析
Clojureによるログ収集と解析Clojureによるログ収集と解析
Clojureによるログ収集と解析
 
Cocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使うCocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使う
 
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回
 
よろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだよろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだ
 
2018年度 若手技術者向け講座 インデックス
2018年度 若手技術者向け講座 インデックス2018年度 若手技術者向け講座 インデックス
2018年度 若手技術者向け講座 インデックス
 
"Hello World!" から始める Calc で LibreOffice Basic
"Hello World!" から始める Calc で LibreOffice Basic"Hello World!" から始める Calc で LibreOffice Basic
"Hello World!" から始める Calc で LibreOffice Basic
 
Powershell基礎_20180521用
Powershell基礎_20180521用Powershell基礎_20180521用
Powershell基礎_20180521用
 
マクロでBASEを操作しよう BASE Let's operate with macros
 マクロでBASEを操作しよう  BASE Let's operate with macros マクロでBASEを操作しよう  BASE Let's operate with macros
マクロでBASEを操作しよう BASE Let's operate with macros
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編
 
実践 Reactive Extensions
実践 Reactive Extensions実践 Reactive Extensions
実践 Reactive Extensions
 
Androidで使えるJSON-Javaライブラリ
Androidで使えるJSON-JavaライブラリAndroidで使えるJSON-Javaライブラリ
Androidで使えるJSON-Javaライブラリ
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in Scala
 
JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介
 

Destaque

Rails best practices_slides
Rails best practices_slidesRails best practices_slides
Rails best practices_slidesCao Van An
 
Rails 3 ActiveRecord
Rails 3 ActiveRecordRails 3 ActiveRecord
Rails 3 ActiveRecordBlazing Cloud
 
What's new in Rails 4
What's new in Rails 4What's new in Rails 4
What's new in Rails 4Lucas Caton
 
Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Yasuko Ohba
 

Destaque (6)

Rails best practices_slides
Rails best practices_slidesRails best practices_slides
Rails best practices_slides
 
Rails 3 ActiveRecord
Rails 3 ActiveRecordRails 3 ActiveRecord
Rails 3 ActiveRecord
 
Active record(1)
Active record(1)Active record(1)
Active record(1)
 
What's new in Rails 4
What's new in Rails 4What's new in Rails 4
What's new in Rails 4
 
Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子
 
ActiveRecord 2.3
ActiveRecord 2.3ActiveRecord 2.3
ActiveRecord 2.3
 

Semelhante a named_scope more detail

Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2Nishida Kansuke
 
「愛されたい!」と思ったときにJavaで書くRubyクラス
「愛されたい!」と思ったときにJavaで書くRubyクラス「愛されたい!」と思ったときにJavaで書くRubyクラス
「愛されたい!」と思ったときにJavaで書くRubyクラスKoichiro Ohba
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413Funato Takashi
 
An Internal of LINQ to Objects
An Internal of LINQ to ObjectsAn Internal of LINQ to Objects
An Internal of LINQ to ObjectsYoshifumi Kawai
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.jsTanUkkii
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門Sho A
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Tomoharu ASAMI
 
【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.jsYuto Suzuki
 
名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道Shigeru UCHIYAMA
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会Mugen Fujii
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patternsnekop
 
Scala による自然言語処理
Scala による自然言語処理Scala による自然言語処理
Scala による自然言語処理Hiroyoshi Komatsu
 
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming ParadigmCookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming ParadigmMinero Aoki
 

Semelhante a named_scope more detail (20)

Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話 Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
 
「愛されたい!」と思ったときにJavaで書くRubyクラス
「愛されたい!」と思ったときにJavaで書くRubyクラス「愛されたい!」と思ったときにJavaで書くRubyクラス
「愛されたい!」と思ったときにJavaで書くRubyクラス
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413
 
An Internal of LINQ to Objects
An Internal of LINQ to ObjectsAn Internal of LINQ to Objects
An Internal of LINQ to Objects
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
Yesod(at FPM2012)
Yesod(at FPM2012)Yesod(at FPM2012)
Yesod(at FPM2012)
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js
 
Project lambda
Project lambdaProject lambda
Project lambda
 
名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
Scala による自然言語処理
Scala による自然言語処理Scala による自然言語処理
Scala による自然言語処理
 
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming ParadigmCookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
 

Mais de Kyosuke MOROHASHI

Ruby ecosystem applied to agile project
Ruby ecosystem applied to agile projectRuby ecosystem applied to agile project
Ruby ecosystem applied to agile projectKyosuke MOROHASHI
 
Test Context Arrangement Recipebook
Test Context Arrangement RecipebookTest Context Arrangement Recipebook
Test Context Arrangement RecipebookKyosuke MOROHASHI
 
Begin cucumber-in-real-world
Begin cucumber-in-real-worldBegin cucumber-in-real-world
Begin cucumber-in-real-worldKyosuke MOROHASHI
 
Rails testing environment, 2009 fall
Rails testing environment, 2009 fallRails testing environment, 2009 fall
Rails testing environment, 2009 fallKyosuke MOROHASHI
 
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"Kyosuke MOROHASHI
 
OSC2008 勉強会大集合 Rails勉強会@東京
OSC2008 勉強会大集合 Rails勉強会@東京OSC2008 勉強会大集合 Rails勉強会@東京
OSC2008 勉強会大集合 Rails勉強会@東京Kyosuke MOROHASHI
 
Capistrano in practice - WebCareer
Capistrano in practice - WebCareerCapistrano in practice - WebCareer
Capistrano in practice - WebCareerKyosuke MOROHASHI
 
そうだ勉強会に行こう
そうだ勉強会に行こうそうだ勉強会に行こう
そうだ勉強会に行こうKyosuke MOROHASHI
 

Mais de Kyosuke MOROHASHI (12)

Introduction HTTP via cURL
Introduction HTTP via cURLIntroduction HTTP via cURL
Introduction HTTP via cURL
 
Ruby ecosystem applied to agile project
Ruby ecosystem applied to agile projectRuby ecosystem applied to agile project
Ruby ecosystem applied to agile project
 
Test Context Arrangement Recipebook
Test Context Arrangement RecipebookTest Context Arrangement Recipebook
Test Context Arrangement Recipebook
 
Begin cucumber-in-real-world
Begin cucumber-in-real-worldBegin cucumber-in-real-world
Begin cucumber-in-real-world
 
Cucumber in Practice(en)
Cucumber in Practice(en)Cucumber in Practice(en)
Cucumber in Practice(en)
 
Rails testing environment, 2009 fall
Rails testing environment, 2009 fallRails testing environment, 2009 fall
Rails testing environment, 2009 fall
 
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
 
Rails Tokyo 035 Cucumber
Rails Tokyo 035 CucumberRails Tokyo 035 Cucumber
Rails Tokyo 035 Cucumber
 
OSC2008 勉強会大集合 Rails勉強会@東京
OSC2008 勉強会大集合 Rails勉強会@東京OSC2008 勉強会大集合 Rails勉強会@東京
OSC2008 勉強会大集合 Rails勉強会@東京
 
Capistrano in practice - WebCareer
Capistrano in practice - WebCareerCapistrano in practice - WebCareer
Capistrano in practice - WebCareer
 
Rails <form> Chronicle
Rails <form> ChronicleRails <form> Chronicle
Rails <form> Chronicle
 
そうだ勉強会に行こう
そうだ勉強会に行こうそうだ勉強会に行こう
そうだ勉強会に行こう
 

named_scope more detail