0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】scopeではなぜfirstメソッドを定義しないのか

Posted at


##きっかけ

下記のコードを見たときに少し違和感を覚えた。

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行ですっきり書けるもの」という認識しかなかったが
仕様をよく理解して適切に使っていきたい。

##参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?