3
1

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.

【Ruby on Rails】配列の繰り返し処理を何度も書きたくない場合

Last updated at Posted at 2020-11-10

配列の繰り返し処理を何度も書きたくない場合どうするか

全ての配列を処理するためのメソッドを一箇所に定義します


  • 繰り返し処理した配列を再び配列に生成し直す場合のお話です(処理メソッドは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"

  •      {id: obj.id}  # Userモデル1件のIDを取得
      when "articles"
          # Articleモデル1件に対して実行したい処理
      when "comments"
          # Commentモデル1件に対して実行したい処理
      end
    
    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} ]

となります。


以上です🙇‍♂️

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?