質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • Ruby

    7017questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    6737questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Railsでの条件分岐の記述について教えてください。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 175

koume

score 197

Rails5.1.3でWebアプリケーション制作の勉強中です。条件分岐の記述について教えてください。
やりたいことは 数段階に分けて条件分岐し途中で条件がtrueになったら抜けるみたいなイメージです。

@cccにはチェックしたい主キーが入っています
・eeeには@cccの中の「在籍」のidが入っています。
・@dddには@cccの要素数が入っています。
・@fffには@cccの中の「在籍」の要素数が入っています。
・

if @ddd == @fff------------------ # 要素数の数が同じだったらこの式から抜ける。          
 @lily = @ddd ----------------- # @lilyの値をビューに渡し表示する。
else ---------------------------- # 要素数の数が違った場合、以下を実行する。 
  kkk = [] ---------------------- # kkkという空の配列を作る。
  kkk << @ccc ------------------- # if文を実行するため配列kkkに値を入れる。
  vvv = [] ---------------------- # register_checkで使用する配列を作成。
  vvv = @ccc - eee -------------- # 配列vvvに不在の主キーを代入する。
  register_check ---------------- # ここでvvvのグループの現在の月の在籍、不在をチェックする。      
  if kkk.empty? ---------------- # チェックした結果、在籍が 0 なら1回目のチェックをする。
    register_check  
  else -------------------------- # 在籍が1つ以上あれば以下を実行しこの式から抜ける。  
    eee << r ------------------- # 在籍が1つ以上あれば配列にrを代入する。
    if kkk.empty? --------------- # チェックした結果、在籍が 0 なら2回目のチェックをする。
      register_check 
    else ------------------------ # 在籍が1つ以上あれば以下を実行しこの式から抜ける。   
      eee << r ------------------ # 在籍が1つ以上あれば配列にrを代入する。
      if kkk.empty? ------------- # チェックした結果、在籍が 0 なら3回目のチェックをする。
        register_check            「在籍」が確認出来るまで以下これを数回繰り返す。 
      else    
        eee << r
        if kkk.empty?
          register_check 
        else   
          eee << r     
          if kkk.empty?
            register_check 
          else  
            eee << r
            if kkk != nil
              eee << r
            end
          end
        end
      end
    end
  end
end    


同じコードの繰り返しになっていますが メソッドregister_check を実行し 配列 kkk に値を代入し、次の if kkk.empty? が false だったら途中で抜けるとしたいのです。
質問内容が少し雑でわかりにくいかと思いますが、こんな感じで条件分岐をつなげての記述はできるのでしょうか?
どなたか教えていただけないでしょうか?宜しくお願いします。

追記

def register_check
    vvv.each do |t|
      hhh = Customer.find_by(id: t)
      iii = hhh.nickname 
      aaa = Sponsor.where(sponsor1: iii).pluck(:customer_id)    
      kkk = []
      vvv = []

      aaa.each do |u|   
        @coala = Ragister.find_by(customer_id: u) 
        if @month == 1
          fox = @coala.jan
        elsif @month == 2
          fox = @coala.feb
        elsif @month == 3
          fox = @coala.mar
        elsif @month == 4
          fox = @coala.apr
        elsif @month == 5
          fox = @coala.may
        elsif @month == 6
          fox = @coala.jun
        elsif @month == 7
          fox = @coala.jul
        elsif @month == 8
          fox = @coala.aug
        elsif @month == 9
          fox = @coala.sep
        elsif @month == 10
          fox = @coala.oct
        elsif @month == 11
          fox = @coala.nov
        else
          fox = @coala.dec
        end

        if fox == "在籍"
          kkk << u
        end

        if fox == "不在"
          vvv << @ccc
        end
      end
    end
  end


追記
コードの説明を記述中におかしなところがあったので少し編集しました。
意味を持った変数名にしようとしましたがいいのが思いつかなかったので変更しておりません。すいません。
このような記述でチェックをして何回目かで「在籍」が確認できた場合(配列kkkが「空」じゃない。)にその時点でこの式から抜け出すようにしたいのですがこのような記述でいいのでしょうか?わかりにくくてすいません。宜しくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • gouf

    2017/10/19 23:37

    register_check はどのような処理をしていますか?

    キャンセル

  • koume

    2017/10/19 23:42

    ご返事ありがとうございます。コードを追記させていただきました。

    キャンセル

  • gouf

    2017/10/19 23:51

    公開できる部分、できない部分、あるとは思いますが、提示する場合のコードの、特に変数名など、どのような処理をしたいのかが判るような意味のある名前に変更することは可能でしょうか(たとえば fox などは無意味に思えます)

    キャンセル

  • koume

    2017/10/19 23:57

    すいませんでした。動きを確認したくて変数名に動物の名前をつけていました。変数名を変えるのとコードの説明について編集して投稿し直します。

    キャンセル

回答 2

check解決した方法

+1

もう少し違うやり方を考えて見ます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

検証はしていないものの、同じ動作をするよう ごく一部を書き換えてみました

def register_check
  vvv.each do |t|
    hhh = Customer.find_by(id: t)
    iii = hhh.nickname
    aaa = Sponsor.where(sponsor1: iii).pluck(:customer_id)
    kkk = []
    vvv = []

    month_name = %w[jan feb mar apr may jun jul aug sep oct nov dec] # 12個の月
    month_index = *(1..12)
    month_zip = month_index.zip(month_name) # 月の数値と月の名前を対応付け
    # => [[1, "jan"], [2, "feb"], ...]

    aaa.each do |u|
      @coala = Ragister.find_by(customer_id: u)
      fox =
        month_zip.each do |index, name|
          if @month.eql?(index)
            # 文字列またはシンボルをもとにメソッド名を指定して呼び出す
            # たとえばループ処理で今が条件を満たす2であるとき:
            # index, name = [2, "feb"] になるので
            # @coala.feb を書いたのと同じ動作になる
            # そしてループを抜けるときにその値を返す
            break @coala.method(name).call
          end
        end

      kkk << u if fox.eql?('在籍')
      vvv << @ccc if fox.eql?('不在')
    end
  end
end

全体像が見えないのでなんとも言えないです
ただ、「かなり頑張ってコードを書かないといけない」雰囲気ではあるので、モデルの作り方やクエリの書き方を工夫するなど、これらの処理の前の段階で、後々苦しまないように構築するのは大事であるように思えます(pluck メソッドの使用を0に近づけるなど)

  • メソッドの行数を10~20に抑える
  • コードの複雑度を計測して20を超えないように書く

といったことを意識しつつ書いていくとよいとおもいます

何か参考になれば幸いです

 Links

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/21 16:23

    回答ありがとうございます。ずっと悩んでいたので参考にさせていただきます。今後とも宜しくお願いします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7017questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    6737questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。