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

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

詳細はこちら
Ruby on Rails 5

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

5057閲覧

Rails:"created_at"の日付ごとに、データをグループ化して表示したい

takumikai

総合スコア16

Ruby on Rails 5

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

2クリップ

投稿2019/09/07 09:15

編集2019/09/10 00:37

□ こういう↓ 「リスト>todoカード」のデータが表示されるアプリをRailsで作っているのですが

イメージ説明

↓理想のイメージ↓

  • 月/日ごとに、コンテンツがまとまっていて、並んでいる

イメージ説明

やりたいこと

● created_atの日付ごとに、セクションを分けて表示したい

ー9/1 の 「リスト>todoカード」一覧
ー9/2 の ・・・・
という風にしていきたい

試したこと
  • groupを使い、date(created_at)にすれば日付ごとにグルーピングされるかと思ったがされなかった
  • かつ表示も**「最新の1件」になってしまった**

やり方が間違っていると思うのですが、ご教授いただけたらと思います・・・・????

コード

・1. kanbanを表示している views/top/index.html.erb
・2. top_controller
・3. 今入力しているデータ(9/7のものと、8/24のものがある。これらを一覧で、日付ごとにグループ化して表示したい)

html

1<div class="topPage"> 2 3 <div class="listWrapper"> 4 <% @lists.each do |list| %> 5 <div class="list"> 6 <div class="list_header"> 7 <h2 class="list_header_title"><%= list.title %></h2> 8 </div> 9 10 <div class="cardWrapper"> 11 <% list.cards.each do |card| %> 12 <div class="card"> 13 <h3 class="card_title"><%= card.title %></h3> 14 <div class="addCard"> 15 <i class="far fa-plus-square"></i> 16 <%= link_to "アイテムを追加", new_list_card_path(list), class: "itemAdd" %> 17 </div> 18 </div> 19 20 21 22 <%end%> 23 24 <div class="addCard"> 25 <i class="far fa-plus-square"></i> 26 <%= link_to "さらにカードを追加", new_list_card_path(list), class: "addCard_link" %> 27 </div> 28 </div> 29 30 </div> 31 <% end %> 32 </div> 33 34 35</div>

rb

1class TopController < ApplicationController 2 def index 3 @lists = List.where(user: current_user).order("created_at ASC").group("date(created_at)") 4 end 5end 6 7

sql

1sqlite> select * from Lists 2 ...> ; 31|第1優先TODO|1|2019-08-24 06:34:36.423364|2019-08-24 06:34:36.423364 42|第1優先TODO|1|2019-08-24 06:35:23.580541|2019-08-24 06:35:23.580541 53|da2|1|2019-08-24 06:36:01.976279|2019-08-24 06:36:01.976279 64|lll|2|2019-09-07 07:13:13.366874|2019-09-07 07:13:13.366874 75|97日 : 2つめのリスト|2|2019-09-07 07:14:20.287058|2019-09-07 07:14:20.287058 86|9/7 -no2|2|2019-09-07 08:41:49.370980|2019-09-07 08:41:49.370980

↓ create_users.rb

rb

1# frozen_string_literal: true 2 3class DeviseCreateUsers < ActiveRecord::Migration[5.2] 4 def change 5 create_table :users do |t| 6 ## Database authenticatable 7 t.string :email, null: false, default: "" 8 t.string :encrypted_password, null: false, default: "" 9 10 ## Recoverable 11 t.string :reset_password_token 12 t.datetime :reset_password_sent_at 13 14 ## Rememberable 15 t.datetime :remember_created_at 16 17 ## Trackable 18 # t.integer :sign_in_count, default: 0, null: false 19 # t.datetime :current_sign_in_at 20 # t.datetime :last_sign_in_at 21 # t.string :current_sign_in_ip 22 # t.string :last_sign_in_ip 23 24 ## Confirmable 25 # t.string :confirmation_token 26 # t.datetime :confirmed_at 27 # t.datetime :confirmation_sent_at 28 # t.string :unconfirmed_email # Only if using reconfirmable 29 30 ## Lockable 31 # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts 32 # t.string :unlock_token # Only if unlock strategy is :email or :both 33 # t.datetime :locked_at 34 35 36 t.timestamps null: false 37 end 38 39 add_index :users, :email, unique: true 40 add_index :users, :reset_password_token, unique: true 41 # add_index :users, :confirmation_token, unique: true 42 # add_index :users, :unlock_token, unique: true 43 end 44end 45

↓ create_lists.rb

rb

1class CreateLists < ActiveRecord::Migration[5.2] 2 def change 3 create_table :lists do |t| 4 5 t.string :title, null: false, limit: 255 6 t.references :user, null: false 7 8 t.timestamps 9 end 10 end 11end

↓ create_cards.rb

class

1 def change 2 create_table :cards do |t| 3 4 t.string :title, null: false 5 t.references :list, null: false 6 7 t.timestamps 8 end 9 end 10end 11

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

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

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

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

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

Orlofsky

2019/09/07 10:04

質問にCREATE TABLE文も載せてください。
takumikai

2019/09/10 00:38

表記しました!(あってますかね)
guest

回答1

0

ベストアンサー

何かのcolumnでgroup分けしてオカレンスを得るというのは生SQLで大昔やったような記憶が有りますが、今や書けません。、、(涙)Rails構文ではもっと 難しそうです。
ので、今こういうことを行うとき私は手を抜いて、railsにやらせています。
数が多くなってページングが必要になると厄介になりますが、グループ分けしてどう表示したいのか、がviewからは読めないので、とりあえずはページング無しで。

絞りこまれたListの数が多いと別の手が必要ですが、全部読み込んでも支障ない位の数なら、
List.where(user: current_user).group_by{|list| list.created_at.to_date}
でグループ分けします。

また、
List.where(user: current_user).order("created_at ASC")
で読み込んだ場合は
created_at.to_date が同じ間は同じgroupとして処理
という方法も採れます。

投稿2019/09/07 10:46

winterboum

総合スコア23567

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

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

takumikai

2019/09/10 00:27

ありがとうございます! sqlだけでやるのは、なかなかしんどいのですね。 >List.where(user: current_user).group_by{|list| list.created_at.to_date} ありがとうございます! これについて、質問なのですが、 ①group_by{|xxxx| ~~} の "|xxxx|"の部分の書き方のルールを知りたいです  →はじめて見る書き方でして、どういう意味なのか知っておきたいと思いました ②逆に、部分的に読み込みを制御するという書き方もできるのでしょうか?  →Railsで制御するのか、他の部分で制御するのか気になっています  →ページネーションなどする場合は、別の技術(JS?など)が必要なのかなと思ってます
winterboum

2019/09/10 02:18

①XXXXの部分は 何でもお気に入りのもの でよいのですが、代入されるのは、group_byのレシーバ(である配列みたいなもの)の要素です。 ですから、Listのオカレンスであることを表すように list とするのが無難です。 ②全部読み込んだら大変だというくらいの多量の場合のために、find_in_batches という1000位ずつ順に読み込んでくれるmethodがありますが、これはorderが無視されますのであまり使えない。 ので、 group_by したい項目でorder掛けて、その値が同じ間毎に処理するという方法を取っています。 ページネーションは、どう表示したいか、で考え方が変わるので  ページ10件として、10件とは XXXX 10件なのか、その中身10件なのか  でまるで変わる。 その時にまた検討するということになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問