配列の繰り返し処理を何度も書きたくない場合どうするか
→ 全ての配列を処理するためのメソッドを一箇所に定義します
- 繰り返し処理した配列を再び配列に生成し直す場合のお話です(処理メソッドはmapを使います)。
- 今回用意するモデル例(別に何でも良いのですが)
- User(ユーザーモデル)
- Article(記事モデル)
- Comment(コメントモデル)
としておきます。
それぞれの配列を繰り返し処理するメソッドの定義
-
ArticleモデルならArticlesController、CommentモデルならCommentsControllerと様々なControllerで利用することになると思うので、
Concern
ファイルにて定義していきます。 -
app/controllers/concern配下に適当にloop_array_concern.rbという名前のファイルを作成してそこにメソッドを記述していくことにします。そして、このConcernファイルはApplicationControllerへincludeします。
app/controllers/concern/loop_array_concern.rb
module LoopArrayConcern
extend ActiveSupport::Concern
included do
helper_method :loop_array
end
def loop_array(array_data) # array_dataは引数をハッシュとして受け取る。キーはobjectとobject_typeとします。
object = array_data[:object]
object_type = array_data[:object_type]
object.map do |obj|
case object_type
when "users"
# Userモデル1件に対して実行したい処理をここに記述
when "articles"
# Articleモデル1件に対して実行したい処理をここに記述
when "comments"
# Commentモデル1件に対して実行したい処理をここに記述
end
end
end
end
>```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
include LoopArrayConcern # モジュール名を記述
end
それぞれのコントローラにて配列のループ処理を行わせる(loop_array()メソッドを呼び出す
)
- UsersController
def action
loop_array(object: User.all, object_type: "users")
end
>* ArticlesController
>```ruby
def action
loop_array(object: Article.all, object_type: "articles")
end
- CommentsController
def action
loop_array(object: Comment.all, object_type: "users")
end
<br>
解説
--
* object_typeキーによってどのモデルを処理するのかの条件分岐を行ってくれます。
* こうすることでコードも見易くなり、修正も行い易くなり、追加で配列の処理を行いたい場合も数行の記述で済みます。
<br>
利用例
--
* 例えば、全てのUserのそれぞれのIDを取得したい場合はどうすれば良いかを見てみます。
* それでは仮にUser.allで取得できるデータが、`User.all = [ {id: 1, name: "田中"}, {id: 2, name: "佐藤"}, {id: 3, name: "マイケル"} ]`だとします。
>```ruby:UsersController
def action
loop_array(object: User.all, object_type: "users")
end
app/controllers/concern/loop_array_concnern.rb
def loop_array(array_data)
object = array_data[:object]
object_type = array_data[:object_type]
object.map do |obj|
case object_type
when "users"
-
end
{id: obj.id} # Userモデル1件のIDを取得 when "articles" # Articleモデル1件に対して実行したい処理 when "comments" # Commentモデル1件に対して実行したい処理 end
end
>と、上記のように記述すると、`loop_array(object: User.all, object_type: "users")`で取得できる配列は、
>```ruby
@users_id = loop_array(object: User.all, object_type: "users")
# @user_id = [ {id: 1}, {id: 2}, {id: 3} ]
となります。
以上です🙇♂️