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
が発生
参考
こちらに詳しく書いてあります
おかしな点があればご指摘ください