Concernを触ってみる。

Rails において共通の処理を切り出して記述する仕組みが、Concern だそうだ。
こちらを触ってみたい。

目次

実行環境

  • windows
    • Windows10 ver.1909
  • Mac
    • macOS Mojave 10.14.4

参考

concern ってなんだよ

「コンサーン」ってなんだよ。と正直思った。
翻訳をかけると、「懸念」という訳が出る。
開発者の懸念事項をまとめておくということだけど、ネーミングに納得感はあまりないというのが率直な感想。

concern を導入

今回は、以下の 2 つの User と Food モデル共通処理を concern にまとめてみます。

  • 最近変更された順に上位 3 個を取り出す

実装(scope 追加)

app\models\concerns\filter.rbを新規に作成する。
ファイル名と、Module 名は合わせることには注意する。

app\models\concerns\filter.rb
1
2
3
4
5
6
7
module Filter
extend ActiveSupport::Concern

included do
scope :recently3, -> {order(updated_at: :desc).limit(3)}
end
end

app\models\user.rbを編集する。

app\models\user.rb
1
2
3
class User < ApplicationRecord
include Filter #書き加える
end

app\models\food.rbを編集する。

app\models\food.rb
1
2
3
class Food < ApplicationRecord
include Filter #書き加える
end

app\controllers\users_controller.rbを編集する。

app\controllers\users_controller.rb(抜粋)
1
2
3
4
5
6
class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]
def index
@users = User.recently3 # app\models\concerns\filterで定義したscopeを使う
end
end
app\controllers\foods_controller.rb(抜粋)
1
2
3
4
5
6
class FoodsController < ApplicationController
before_action :set_food, only: [:show, :edit, :update, :destroy]
def index
@foods = Food.recently3 # app\models\concerns\filterで定義したscopeを使う
end
end

(確認用なので、コントローラでの利用は User だけとしておく)

確認(scope 追加)

bundle exec rails sで起動し、localhost:3000/usersとすると、直近更新した 3 件のみ表示されるようになったことが確認できます。
localhost:3000/foodsでも、直近更新した 3 件のみ表示されるようになったことが確認できます。
本来ならば、画面を切り分けるところですが、まぁ確認なので index で直近 3 件しか出なくてもいいこととしましょう。


concern を使って処理の共通化を試みてみました。
まだまだ使いこなせているとは思えませんが、うまく使っていきたいところです。

ではでは。