前提・実現したいこと
Ruby on Rails で HTML テーブル表示用に nil を含んだ配列を返したい。
1日につき 0件 または 1件の Report が存在している前提で、 HTML テーブル上で日毎に Report が表示したいと考えています。Report が存在しない日については空欄となります。
HTML 表示時に便利なように、Report が存在しない日は nil となるようなクエリのかけ方はないでしょうか ?
(実際には json を返却して、フロントエンドで表示させます。)
html
1<-- 表示したいテンプレート(例) --> 2 3<table> 4 <tr> 5 <td>日付</td> 6 <td>レポート</td> 7 </tr> 8 <% @dates.each_with_index |date, i|> 9 <tr> 10 <td><%= date.to_s %></td> 11 <td><%= @reports[i].title if @reports[i] ></td> 12 </tr> 13 <% end %> 14</table>
ruby
1# 欲しいもの 2start_date = Date.new(2019, 2, 1) 3end_date = Date.new(2019, 2, 28) 4 5@reports = Report.nice_query 6#=> [#<Report: date=2019-02-01>, #<Report: date=2019-02-02>, nil, #<Report: date=2019-02-04>, ...] 7 8@reports.count 9#=> 28 (Report と nil をあわせて期間の日数分の要素数になる) 10
試したこと
ruby
1monthly_dates = (Date.new(2019,2,1) .. Date.new(2019,2,28)).select.to_a 2monthly_dates.count 3#=> 28 4 5@reports = Report.where(date: monthly_dates) 6@reports.count 7#=> 24 (nil が含まれないので HTML 表示する時に日付がずれてしまう。)
もう一つ、下が一応やりたいことはできるけど、いい感じじゃないパターンです。
ruby
1# 一応やりたいことはできるけどいい感じじゃない 2 3monthly_dates = (Date.new(2019,2,1) .. Date.new(2019,2,28)).select.to_a 4@reports = [] 5 6monthly_dates.each do |date| 7 @reports << Report.where(date: date).first 8end 9 10@reports.count 11#=> 28
これでやりたいことは実現するのですが、日数分のクエリが発生するのでパフォーマンス的によろしくない気がします。
必ずしも、Ruby on Rails からのクエリの方法だけにこだわるわけではなく、直接 SQL を指定する / フロントエンド側で処理するなどでも良いと思っています。
何か良い方法をご教授いただければと思います。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/16 03:17