даты прорыва в HTML-таблице - PullRequest
3 голосов
/ 15 февраля 2012

Есть ли более простой способ сделать это?

контроллер:

def index
  @ranches = Ranch.all
  dates = (Date.today..Date.today + 52.weeks).select(&:sunday?)
  @date_range = dates
  dates.each do |date|
    month = date.strftime("%b")
    year = date.strftime("%Y")
    @dates ||= {}
    @dates[year] ||= {}
    @dates[year][month] ||= []
    @dates[year][month] << date
  end

view:

%table{:border => 1}
  %thead
    %tr
      %th{:rowspan => 3}
        Ranch
      - @dates.each do |year,months|
        -# raise months.inspect
        %th{:colspan => months.collect{|m| m[1]}.flatten.count }
          = year
    %tr
      - @dates.each do |year,months|
        - months.each do |month, days|
          %th{:colspan => days.count}
            = month
    %tr
      - @dates.each do |year,months|
        - months.each do |month, days|
          - days.each do |day|
            %th
              = day.day

Это вывод, который я получаю / ищу:

html table with year month day breakout

В дополнение к этому я также собираюсь сделать что-то вроде следующего (это будут следующие и следующие строки:

%tbody
  - @ranches.each do |ranch|
    %tr
      %td
        = ranch.name
      - ranch.placements.each do |placement|
        - @date_range.each do |date|
          - start_date = date
          - end_date = date.end_of_week
          - if (start_date..end_date).include?(placement.placement_date)
            %td
              = placement.value 

IЯ еще не разобрался с colspan и т. д. для этой части. Я надеюсь, что есть какой-то волшебный способ сделать это, чтобы он выглядел лучше и работал лучше. Я открыт для большинства любых предложений.

1 Ответ

3 голосов
/ 16 февраля 2012

Вот сила Enumerable#group_by и Enumerable#chunk!

require 'date'
require 'haml'

now = Date.today
next_sunday = now - now.wday + 7
@sundays = (0...52).map { |w| next_sunday + 7*w }

puts Haml::Engine.new(<<ENDHAML).render(binding)
%table
  %thead
    %tr
      - @sundays.group_by(&:year).each do |year,days|
        %th{colspan:days.length}= year
    %tr
      - @sundays.chunk{ |d| d.strftime('%b') }.each do |month,days|
        %th{colspan:days.length}= month
    %tr
      - @sundays.each do |date|
        %th= date.day
ENDHAML

Производит:

<table>
  <thead>
    <tr>
      <th colspan='46'>2012</th>
      <th colspan='6'>2013</th>
    </tr>
    <tr>
      <th colspan='2'>Feb</th>
      <th colspan='4'>Mar</th>
      <th colspan='5'>Apr</th>
      <th colspan='4'>May</th>
      <th colspan='4'>Jun</th>
      <th colspan='5'>Jul</th>
      <th colspan='4'>Aug</th>
      <th colspan='5'>Sep</th>
      <th colspan='4'>Oct</th>
      <th colspan='4'>Nov</th>
      <th colspan='5'>Dec</th>
      <th colspan='4'>Jan</th>
      <th colspan='2'>Feb</th>
    </tr>
    <tr>
      <th>19</th>
      <th>26</th>
      <th>4</th>
      <th>11</th>
      <th>18</th>
      <th>25</th>
      <th>1</th>
      <th>8</th>
      <th>15</th>
      <th>22</th>
      <th>29</th>
      <th>6</th>
      <th>13</th>
      <th>20</th>
      <th>27</th>
      <th>3</th>
      <th>10</th>
      <th>17</th>
      <th>24</th>
      <th>1</th>
      <th>8</th>
      <th>15</th>
      <th>22</th>
      <th>29</th>
      <th>5</th>
      <th>12</th>
      <th>19</th>
      <th>26</th>
      <th>2</th>
      <th>9</th>
      <th>16</th>
      <th>23</th>
      <th>30</th>
      <th>7</th>
      <th>14</th>
      <th>21</th>
      <th>28</th>
      <th>4</th>
      <th>11</th>
      <th>18</th>
      <th>25</th>
      <th>2</th>
      <th>9</th>
      <th>16</th>
      <th>23</th>
      <th>30</th>
      <th>6</th>
      <th>13</th>
      <th>20</th>
      <th>27</th>
      <th>3</th>
      <th>10</th>
    </tr>
  </thead>
</table>
...