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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

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

Ruby on Rails

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

Q&A

解決済

2回答

1110閲覧

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

koume

総合スコア458

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/10/19 14:00

編集2017/10/19 16:16

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が「空」じゃない。)にその時点でこの式から抜け出すようにしたいのですがこのような記述でいいのでしょうか?わかりにくくてすいません。宜しくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gouf

2017/10/19 14:37

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

2017/10/19 14:42

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

2017/10/19 14:51

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

2017/10/19 14:57

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

回答2

0

自己解決

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

投稿2017/10/20 13:25

koume

総合スコア458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

ruby

1def register_check 2 vvv.each do |t| 3 hhh = Customer.find_by(id: t) 4 iii = hhh.nickname 5 aaa = Sponsor.where(sponsor1: iii).pluck(:customer_id) 6 kkk = [] 7 vvv = [] 8 9 month_name = %w[jan feb mar apr may jun jul aug sep oct nov dec] # 12個の月 10 month_index = *(1..12) 11 month_zip = month_index.zip(month_name) # 月の数値と月の名前を対応付け 12 # => [[1, "jan"], [2, "feb"], ...] 13 14 aaa.each do |u| 15 @coala = Ragister.find_by(customer_id: u) 16 fox = 17 month_zip.each do |index, name| 18 if @month.eql?(index) 19 # 文字列またはシンボルをもとにメソッド名を指定して呼び出す 20 # たとえばループ処理で今が条件を満たす2であるとき: 21 # index, name = [2, "feb"] になるので 22 # @coala.feb を書いたのと同じ動作になる 23 # そしてループを抜けるときにその値を返す 24 break @coala.method(name).call 25 end 26 end 27 28 kkk << u if fox.eql?('在籍') 29 vvv << @ccc if fox.eql?('不在') 30 end 31 end 32end

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

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

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

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

Links

投稿2017/10/21 05:48

gouf

総合スコア2321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koume

2017/10/21 07:23

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問