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

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

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

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

Q&A

解決済

3回答

267閲覧

曜日による分岐をスッキリさせたい

og33

総合スコア14

Ruby

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

0グッド

1クリップ

投稿2018/06/08 09:32

編集2018/06/08 23:37

曜日による分岐をスッキリさせたい

現状

if Time.zone.today.sunday? duty = "資源ごみ" toban = Tobanhyo.where(role: 1) elsif Time.zone.today.tuesday? duty = "火曜のゴミ" toban = Tobanhyo.where(role: 2) elsif Time.zone.today.wednesday? duty = "木曜日のゴミ" toban = Tobanhyo.where(role: 3) elsif Time.zone.today.Thursday? || Time.zone.today.friday? duty = "燃えるゴミ" toban = Tobanhyo.where(role: 4) end

理想

変数は分岐のたびに作りたくない ifの分岐は愚直に1つずつやりたくない

よろしくお願いいたします。

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

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

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

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

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

mather

2018/06/08 11:50

if文が完了していないので、endまで書いたほうがいいと思います。また、読みやすくするためにインデントを使いましょう。
og33

2018/06/08 23:37

失礼いたしました。修正いたしました。引き続きよろしくお願いします。
guest

回答3

0

ベストアンサー

Ruby

1duty, toban_id = case Time.zone.today.strftime("%a") 2 when "Sun" then ["資源ごみ", 1] 3 when "Tue" then ["火曜のゴミ", 2] 4 when "Wed" then ["水曜のゴミ", 3] 5 when "Thu","Fri" then ["燃えるゴミ", 4] 6 end 7toban = Tobanhyo.where(role: toban_id)

strftime("%a")じゃなくてwdayもありますが、それだと数字になるので分かりにくい。

投稿2018/06/08 10:20

otn

総合スコア84538

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

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

otn

2018/06/08 10:31

case/whenで分岐せず、曜日でハッシュを引くのもあるかと思います。
mkgrei

2018/06/08 12:45

ハッシュに1票。 なんなら当番表もハッシュに…
otn

2018/06/08 13:54

曜日がどこにも該当しないケースの考慮が要りましたね。
og33

2018/06/14 09:38

ありがとうございました! 一番すっきりしていて初心者の自分にもわかりやすかったので、ベストにさせていただきました!
guest

0

そもそも気になっているポイントなのですが、 Time.zone って動作しますか?なにかライブラリを使っているのかな…?

曜日を取得する場合、 Time.now.wday とすると 0..6 の範囲で曜日が取得できます。

これを使って書く場合、僕ならこうします。

ruby

1SUN = 0 2MON = 1 3TUE = 2 4WED = 3 5THU = 4 6FRI = 5 7SAT = 6 8 9def garbage_day(weekday) 10 case weekday 11 when SUN 12 {garbage_type: "資源ごみ", id: 1} 13 when TUE 14 {garbage_type: "火曜のゴミ", id: 2} 15 when WED 16 {garbage_type: "水曜のゴミ", id: 3} 17 when THU, FRI 18 {garbage_type: "燃えるゴミ", id: 4} 19 else 20 nil 21 end 22end 23 24garbage_today = garbage_day(Time.now.wday) 25 26if garbage_today 27 toban = Tobanhyo.where(role: garbage_today[:id]) 28end 29

投稿2018/06/09 10:26

mather

総合スコア6753

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

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

0

ruby

1INFOS = [ 2 # duty, sql param 3 nil, 4 nil, # 1: 月曜 5 ['火曜のゴミ', 2], # 2: 火曜 6 nil, # 3: 水曜 7 ['木曜日のゴミ', 3], # 4: 木曜 8 ['燃えるゴミ', 4], # 5: 金曜 9 nil, # 6: 土曜 10 ['資源ごみ', 1], # 7: 日曜 11].freeze 12 13duty = nil 14toban = nil 15 16infos = INFOS[Time.zone.today.cwday] 17if info 18 duty = info[0] 19 toban = Tobanhyo.where(role: info[1]) 20end

名前と where する時のパラメータを 曜日 (月曜が 1) を indexにもつ配列にしてみました。

投稿2018/06/09 03:29

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問