🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Q&A

2回答

3348閲覧

Rails : 日付ごとに投稿をグループ化して表示したい

takumikai

総合スコア16

Ruby on Rails 5

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

0グッド

0クリップ

投稿2019/10/01 11:49

編集2019/10/04 02:28

やりたいこと

「List>Card>Log」のグループを日付ごとに並べたい

・ListごとにTodoを並べられるアプリケーションを作っています
・作成したデータが日付ごとに区切られて表示する、表示方法を考えています
・新しいもの順に並べるのはできそうだが、日付でグループが分かれる形で表示する方法がよくわかっていないです
・SQLのgroup_byを使ってやるのかなと思っているのですが・・・?

イメージ説明

イメージ説明


質問

以下のようなアドバイスをもらっているのですが、内容を理解できず全然見通しがたってないです。。。
(あんまり何度も聞ける相手ではないのでこちらに投稿してます)

この内容でやる場合は「学んだ方が良さそう内容」や「もう少し詳しい実装方針」のアドバイスいただけると嬉しいです。

他のやり方でも構いません!

リストのループの先頭で日付を変数に入れて、変数の日付とリストの日付をifで比較して、異なった場合に表示を切り替えるという処理にすればいけそうな気がする

before_date = '' @list.each do |list| # ループ1回転目のみ必ず日付を入れる before_date = list.date if before_date.blank? # 前回日付と自身の日付を比較 if before_date == list.date # 日付の切り替わりがなかった時の処理 else # 日付が切り替わった時の処理 end # 自身の日付を前回日付として格納 before_date = list.date end

github:コードを載せておきます

ここに現在のものすべて載ってます↓
https://github.com/takuming/focus

現在のView側のコード
スクショのものを表示している、View部分のコードを貼っておきます

erb

1<div class="topPage"> 2 <div class="listWrapper"> 3 <% @list.each do |list| %> 4 <div class="list"> 5 <div class="list_header"> 6 <h2 class="list_header_title"> 7 <%= list.title %> 8 </h2> 9 <div class="list_header_action"> 10 <%= link_to content_tag(:i, '削除', class: 'fas fa-trash'), list, method: :delete, data: { confirm: "#{list.title}を削除して大丈夫ですか?" } %> 11 <%= link_to(content_tag(:i, '編集', class: 'fas fa-pen'), edit_list_path(list)) %> 12 </div> 13 </div> 14 15 <div class="cardWrapper"> 16 <% list.cards.each do |card|%> 17 <div class="card"> 18 <div class="head"> 19 <h3 class="card_title"> 20 <%= card.title %> 21 </h3> 22 <li class="btn_start"> 23 <%= form_tag("/cards/#{card.id}/log/start_time") do %> 24  <input type="hidden" name="card_id"> 25 <input type="submit" value="スタート" class="btn_small"> 26 <% end %> 27 </li> 28 <li class="btn_start"> 29 <%= form_tag("/cards/#{card.id}/log/end_time") do %> 30 <input type="hidden" name="card_id"> 31 <input type="submit" value="ストップ" class="btn_small"> 32 <% end %> 33 </li> 34 </div> 35 36 <div class="section_log"> 37 <% card.logs.each do |log|%> 38 <div class='time_log'> 39 <% @t1 = log.created_at.strftime("%H:%M:%S") %> 40 <% @t2 = log.end_time %> 41 <p>計測 → </p><p>開始: <%= @t1 %></p><span>-</span><p>終了: <%= @t2 %></p> 42 <% if @t1.present? && @t2.present? && %> 43 <p>合計: <%= log.total_time%> </p> 44 <% else %> 45 <p>何もないよ</p> 46 <% end %> 47 </div> 48 <%end%> 49 </div> 50 51 <div class="cardContents_btnArea"> 52 <%= link_to '編集する', edit_list_card_path(card.list, card), class: "edit_btn" %> 53 <%= link_to '削除をする', list_card_path(card.list, card), class: "text-danger delete_btn", method: :delete, data: { confirm: "このカードを削除して大丈夫ですか?" } %> 54 </div> 55 </div> 56 <%end%> 57 58 <div class="addCard"> 59 <i class="far fa-plus-square"></i> 60 <%= link_to "さらにカードを追加", new_list_card_path(list), class: "addCard_link" %> 61 </div> 62 </div> 63 64 </div> 65 <% end %> 66 </div> 67</div> 68

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

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

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

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

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

winterboum

2019/10/01 12:54 編集

「日付ごとに」とはどうしたいのか、が良くわかりません。 1) List>Card>Log のモデルの関連の定義部分を追記して下さい 2) 日付 は List>Card>Log のどこに入り込むのですか?  こういう画面にしたい、 というのがどういうものになるのかが判るようにして下さい。
siruku6

2019/10/01 12:57

あとは、viewだけでなく、controllerやmodelのソースも掲載されているとよいと感じます ・modelは、associationの状況を一目で把握するため ・controllerは、instance変数のセット状況を確認するため また、実際に変更が提案されるとしたらviweだけでなく、controllerやmodel側の変更が含まれると思いますので、そういう意味でも現状を掲載しておくとよさそうです。
takumikai

2019/10/01 22:59

List単位で日付でグループ化/並ぶ というのがやりたいです!ありがとうございます。
winterboum

2019/10/01 23:19

> List単位で日付でグループ化/並ぶ ではイメージが湧きません。cardとlogの関係もわからない。 目に見える形に出来ませんか?
no1knows

2019/10/02 00:07

すいません。今気づいたのですが、タイトルの「ailsRails」→「Rails」の間違いでしょうか?もしそうなら修正をお願いします。
takumikai

2019/10/04 02:28

イメージ追記しました????
winterboum

2019/10/04 02:34

なるほど、見えてきました。 念の為、List,Card,Log のモデルの関連の定義部分を質問に追記して下さい。 関連の定義とは has_* と belongs_to です
winterboum

2019/10/04 04:36

あれ。。。 listにdateが有るんですか? 以下の様にするのかと思っていたのですが違うのかな 1)複数のListがある 2)おのおののListには複数のcardがある 3)各々のcardには複数のlogがある。 そこで logの日付毎に表示する。 つまり、 10/1のlogのあるCard達 (とそのList) 10/2のlogのあるCard達 (とそのList) 10/3のlogのあるCard達 (とそのList) List にdateが有るということは 10/2のList達とそれにぶら下がるCard と Log 10/3のList達とそれにぶら下がるCard と Log どちらでしょう
winterboum

2019/10/04 07:24

github見ました。 List には dateなくて、Log に end_time があります。これで分類ですね?
takumikai

2019/10/04 10:04

ありがとうございます! Listにも Created_at,Update_atがあるので、その考え方だと可能なのかなと思ってます。 あと、Listごとに判別できた方が他の設計を考えるときに良さそうだなと思ってます! (次の日付になったら、デフォルトでListを作って表示しておく。などやりたいなど考えてます)
winterboum

2019/10/04 11:55

プログラムてきにも、孫のLogの日付でまとめるより、親のListの日付でまとめたほうが楽です。 が、 それが目的に合うかどうか。 「何のために何を日付で分けるのか」 それによって考え方が変わります。 Listのupdated_atは CardやLogを触っても変わりませんよ、それで目的に合いますか? 目的は何でしょう。
takumikai

2019/10/05 02:59

・日付ごとにLIst / Card / Logの塊を並べたい  ーListはあるが、カードがない場合も想定、  ーList,Cardはあるが、Logはない場合も想定 しているので、直感的にListでやるべきなのかなと思ってます。 逆に、ListとLogの日付情報を使うことの違いを認識できてないので、そちらを提示してもらえるとより判断はできるのかなと思います。 逆にLogの方が良いと思われたらそのパターンで紹介いただいてもかなり勉強になるので、そちらでも!
guest

回答2

0

これまでのteratailでの質問している内容から、考え方の質問だと推察しました。

グループ化として考えると難しくなるので

リストのループの先頭で日付を変数に入れて、変数の日付とリストの日付をifで比較して、異なった場合に表示を切り替えるという処理にすればいけそうな気がする

これを下記のように考えるとわかりやすいかと思います。

前のレコードと同じ日付の場合は、日付を表示しない。
前のレコードと異なる日付の場合は、日付を表示する。

日付やること
10/1Railsを勉強
10/1phpを勉強
10/2Rubyを勉強
10/3jQueryを勉強

    ↓

日付やること
10/1Railsを勉強
phpを勉強←前のレコードと同じ日付なので、日付を表示しない
10/2Rubyを勉強
10/3jQueryを勉強

このように考えるとポイントは下記の2つになると思います。

・前日の日付をループの最後で登録しておく(before_date)
・ループの一番最初の日付を表示するコードが例外として必要となる(アドバイスに記載のない部分)

投稿2019/10/02 00:05

no1knows

総合スコア3365

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

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

takumikai

2019/10/04 02:19

ありがとうございます! >ループの一番最初の日付を表示するコードが例外として必要となる これがわかってないのですが "before_date = list.date if before_date.blank?" が相当するのではと思ってるんですが違う?のですかね ・before_dateを定義する ・もし before_dateの中身がなかったら ・list.date(listデータんの日付)から持ってくる →1番はじめはbefore_dateの値がないので、適用されて、1番最新の日付が入る と理解してます
takumikai

2019/10/04 03:06

ちなみに書いていただいた概念の理解はだいたいできていたのですが 具体的に何をしたら良いのか、全くわかってない状態です。 「こういう知識が必要」というものがあれば教えていただけると勉強できるのですが、もしよかったらご教授ください・・。 (レベルとしてはもらったアドバイスの書き方自体もちんぷんかんぷんです。ifの基本構造はもちろんわかりますが、「xxx.date→こんなクラスある?」とか、最後endの後ろの「before_date = list.date → なんで過去の日付になるの?」など
no1knows

2019/10/05 12:58

もし僕なら一度立ち止まって、Railsの仕組みを学ぶことをおすすめします。 まずプロゲートのRailsとRubyを受講(1ヶ月980円で受け放題)。 そのあとRailsチュートリアルを実施。 たぶんプロゲートだけでだいたいやりたいことが理解できるかと思います。 ただ気をつけてほしいのは、プロゲートはまだRails6に対応していないため、Rails5だという認識で受講いただくことになります。 それでもやりたいことの全貌がつかめるような気がします。
guest

0

List,Card,Logの役割、何のために日付順に並べるのか、が分からないので、Listベースで良いのか不安だがとりあえず簡単な List で並べる方を
方法は2つあって、一つは no1knowsさんの方法、もうひとつの方を。

1)表示すべきList達を得る
lists = List.order(:updated_at).where(なにがし)

  1. それを日付ごとにまとめる

@lists_by_date = lists.group_by{|list| list.updated_at.to_date}

  1. それを順に表示する

<% @lists_by_date.each do |date,lists| %>
<%= date %>
<% lists.each do |list| %>
.....
<% end %>
<% end %>

投稿2019/10/05 03:20

winterboum

総合スコア23567

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

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

takumikai

2019/10/05 05:22

ありがとうございます!????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問