Как я могу просмотреть все дни недели в Ruby? - PullRequest
2 голосов
/ 18 мая 2010

Я определяю понедельник и пятницу, используя следующее:

@monday = Date.today.at_beginning_of_week

@friday = 5.days.since(@monday)

Но мне на самом деле нужно в любой день проходить по понедельникам, вторникам, средам, брать эту дату и выводить результаты в столбец.

<th>Monday</th>
<th>Tuesday</th>
etcetera

Данная строка, например, будет:

<tr><td>method_with_arg(monday)</td><td>method_with_arg(tuesday)</td><td>method_with_arg(wednesday)</td></tr>

Здесь значение - это метод, принимающий дату в формате args.

Какой самый чистый способ сделать это?

Спасибо.

Ответы [ 4 ]

5 голосов
/ 18 мая 2010
def dates_week(d)
  (d.beginning_of_week...d.beginning_of_week+5).map{|a|
    "<td>#{a.strftime('%F')}</td>"
  }.join
end

dates_week Date.today
#=> "<td>2010-05-17</td><td>2010-05-18</td><td>2010-05-19</td><td>2010-05-20</td><td>2010-05-21</td>"

Вместо a.strftime вы можете вызвать любой другой метод, получающий Date и возвращающую строку, например mails_sent_on(a) и т. Д. Вы также можете использовать yield a для передачи логики, зависящей от даты, используя block:

def dates_week(d)
  (d.beginning_of_week...d.beginning_of_week+5).map{|a|
    yield a
  }.join
end

dates_week(Date.today) { |d|
  "<td>#{mails_sent_on(d)}</td>"
}

или, исключая строки из метода dates_week:

def dates_week(d)
  (d.beginning_of_week...d.beginning_of_week+5).map{|a|
    yield a
  }
end

dates_week(Date.today) { |d|
  mails_sent_on(d)
}.join(', ')

или любой другой формы.

1 голос
/ 19 мая 2010

Я бы пошел на шаг дальше Эндрю и сделал бы блок:

def dates_week(d, delim)
  "<tr>" + (d.beginning_of_week...(d.beginning_of_week+5)).map do |day|
    "<#{delim}> #{yield(day)} </#{delim}>"
  end.join + "</tr>"
end

dates_week(Date.today, "th") {|d| d.strftime("%A")} # => <tr><th>Monday</th><th>Tuesday</th>...
dates_week(Date.today, "td") {|d| some_function(d)} #first row
1 голос
/ 19 мая 2010

Я просто использую Plain Old Ruby Objects, но я думаю, что если вы хотите, чтобы все оставалось СУХИМ, вы бы хотели отделить логику рабочих дней от того, для чего вы используете рабочие дни.

def dates_week(d)
  d.beginning_of_week...(d.beginning_of_week+5)
end

dates_week(Date.today).map {|a|
  "<td>#{a.strftime('%F')}</td>"
}.join
0 голосов
/ 19 мая 2010

Самое простое решение, о котором я мог подумать, было бы:

first_day = Date.today.at_beginning_of_week
days = 7.times.map {|x| first_day + x.days }

days.each do |day|
     puts "<td>" + func(day) + "</td>"
end

Это должно сработать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...