1
0

More than 3 years have passed since last update.

scopeを使いまわしたい

Last updated at Posted at 2020-03-11

scopeを使いまわしたい

複数のモデルに対して同じスコープを使いたい…しかし一々コピペして同じスコープを定義するのは嫌だったので調べてみたところ、スコープ用のモジュールを切り出すのが良いらしい

実現したいこと

こんな動きがしたい.rb
scope :recent, -> { order(created_at: :desc) }

こんなスコープを複数のモデルで使いまわしたい

結論

app/models/concerns/common_scope.rb
module CommonScope
  extend ActiveSupport::Concern
  included do
    scope :recent, -> { order(created_at: :desc) }
  end
end

このモジュールをモデル側でincludeしてやると使えるようになる

ActiveSupport::Concernをextendし、includedブロック内に記述することでscopeをクラスメソッドとして使える

失敗談

ダメな例.rb
module CommonScope
  scope :recent, -> { order(created_at: :desc) }
end

最初はextendする意味が分からずこんな感じで書いてみたが、このままだとscopeがインスタンスメソッド扱いになるのでNoMethodErrorが発生

参考

こちらに詳しく書いてあります

おかしな点があればご指摘ください

1
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
1
0