печать выбранной даты месяца с 1 по 25 и предыдущего месяца 26 до даты конца месяца в rails

#ruby-on-rails

#ruby-on-rails

Вопрос:

@project_site.attendance_month.strftime(«%m»).to_i) это возвращает выбранное целое число месяца в rails.
и печатает выбранную дату месяца с 1 до даты конца месяца.

например, если значение @project_site.attendance_month.strftime(«%m»).to_i) равно 1, оно печатает дату с 1 по 31.
теперь я хочу, чтобы при @project_site.attendance_month.strftime("%m").to_i) значении 1 я хотел печатать только от 1 до 25 выбранного месяца и от 26 до end_of_date от предыдущего месяца выбранного месяца.

мой текущий код-

 <% (1..(Time.days_in_month @project_site.attendance_month.strftime("%m").to_i)).each do |date| %>
 <th class="text-center"><%= date %></th>
<% end %>
  

Пример:

 <% (1..(Time.days_in_month 01)).each do |date| %>
 <th class="text-center"><%= date %></th>
<% end %>
  

теперь он будет печатать с 1 по 31 января, теперь я хочу печатать только с 1 по 25 января и с 26 по 31 декабря. с помощью этого цикла.

Комментарии:

1. Трудно понять, чего вы пытаетесь достичь, поскольку вы слишком много внимания уделяете мелким деталям и не говорите нам точно, что такое желаемый результат. Можете ли вы привести нам пример дат и того, что вы ожидаете получить на выходе? Этот код также действительно вонючий, поскольку в представлении слишком много логики.

2. @max, добавлен пример для лучшего пояснения.

3. Вы ВСЕГДА хотите переключаться на 25-й день на следующий месяц?

4. @Chiperific, да

Ответ №1:

Скажите мне, правильная ли это интерпретация.

Прямо сейчас вы получаете что-то вроде этого:

 <table>
  <tr>
    <th>1</th>
    <th>2</th>
    <th>3</th>
    <th>4</th>
    ...
    <th>31</th>
 <tr>
<table>
  

И вместо этого вы хотите что-то вроде этого:

 <table>
  <tr>
    <th>26</th> <-- December dates: 26 through end of month
    <th>27</th>
    <th>28</th>
    <th>29</th>
    <th>30</th>
    <th>31</th>
    <th>1</th> <-- January dates: 1 through 25
    <th>2</th>
    <th>3</th>
    <th>4</th>
    ...
    <th>26</th>
 <tr>
<table>
  

Если это правильно, я бы предложил фактически создать массив дат:

 [2020-12-26, 2020-12-27, 2020-12-28, 2020-12-29, ... 2020-01-01, 2020-01-02, 2020-01-03, 2020-01-04, ... 2020-01-25]
  

Таким образом, нам не нужно беспокоиться о високосных годах, пересечении лет и т. Д. Ruby справится с этим за нас.

Итак, мы хотим:

  1. Выясните, является ли сегодняшняя дата до или после 25 числа текущего месяца.
  • Если сегодняшняя дата <= 25, вытяните 26 дней предыдущего месяца до конца amp;amp; с 1 по 25 в этом месяце
  • Если сегодняшняя дата> 25, перенесите 26 дней этого месяца в конец amp;amp; следующих месяцев с 1 по 25
  1. Поместите даты в массив, который мы можем использовать в представлении:

(Я предполагаю @project_site.attendance_month , что это объект полной даты, а не только месяц)

 class ProjectSite
  attr_accessor :attendance_month
  # ...

  def attendance_date_array
    if attendance_month.day <= 25
      first_month = attendance_month.beginning_of_month - 1.day
      start_day = Date.new(first_month.year, first_month.month, 26)
      end_day = Date.new(attendance_month.year, attendance_month.month, 25)
    else
      start_day = Date.new(attendance_month.year, attendance_month.month, 26)
      second_month = attendance_month.end_of_month   1.day
      end_day = Date.new(second_month.year, second_month.month, 25)
    end

    ary = []
    (start_day..end_day).each do |d|
      ary << d
    end
    ary
  end
end
  

Эта функция вернет что-то вроде этого:

[Mon, 26 Oct 2020, Tue, 27 Oct 2020, Wed, 28 Oct 2020, Thu, 29 Oct 2020, Fri, 30 Oct 2020, Sat, 31 Oct 2020, Sun, 01 Nov 2020, Mon, 02 Nov 2020, Tue, 03 Nov 2020, Wed, 04 Nov 2020, Thu, 05 Nov 2020, Fri, 06 Nov 2020, Sat, 07 Nov 2020, Sun, 08 Nov 2020, Mon, 09 Nov 2020, Tue, 10 Nov 2020, Wed, 11 Nov 2020, Thu, 12 Nov 2020, Fri, 13 Nov 2020, Sat, 14 Nov 2020, Sun, 15 Nov 2020, Mon, 16 Nov 2020, Tue, 17 Nov 2020, Wed, 18 Nov 2020, Thu, 19 Nov 2020, Fri, 20 Nov 2020, Sat, 21 Nov 2020, Sun, 22 Nov 2020, Mon, 23 Nov 2020, Tue, 24 Nov 2020, Wed, 25 Nov 2020]

Которую вы можете перебирать в своем представлении:

 <% @project_site.attendance_date_array.each do |date| %>
 <th class="text-center"><%= date.day %></th>
<% end %>