##きっかけ
下記のコードを見たときに少し違和感を覚えた。
class Article < ApplicationRecord
scope :published, -> { where(published: true) }
end
class ArticlesController < ApplicationController
def index
@article = Article.published.first
end
end
firstメソッドをモデルのpublishedメソッドの中で書いてしまった方が
コントローラーが少しすっきりする気がするのになんでそうしてないんだろうと疑問に思ったので
scopeについて改めて調べてみた。
class Article < ApplicationRecord
scope :published, -> { where(published: true).first }
end
class ArticlesController < ApplicationController
def index
@article = Article.published
end
end
##問題になりそうなケースと原因
例えば条件に合うArticleがない場合、nilが返るはずのところでなぜか全件取得されてしまうらしい。
これはscopeの中で行われている処理の結果がnilの場合、全件取得が行われる仕様になっているため。
##まとめ
scopeは「メソッドを定義するより1行ですっきり書けるもの」という認識しかなかったが
仕様をよく理解して適切に使っていきたい。
##参考