![](/img/trans.png)
[英]How do you iterate over a range of numbers with each do with/ ERB Ruby on Rails 6?
[英]How do you limit the range of records to weeks for each month with Date.new? Ruby on Rails 6
為了澄清,我正在構建一個搜索,它采用三個參數,即月/年/周數。 我需要知道如何根據傳遞的周數返回記錄。 例如,最有可能有 5 周。 當我 select 所有三個參數時,我應該得到 7 天或更短的記錄。 就目前而言,我已成功按月/年檢索記錄,但現在我將周數作為參數引入。 你如何將周數傳遞給 date.new object?
索引.html.erb
<%= form_tag amb_chart_records_path, :method => :get, :class => "ui form" %>
<div class="three fields">
<div class="field">
<%= select_month(@month.present? @month : nil, {:include_blank => "Select Month"...%>
</div>
<div class="field">
<%= select_year(@year.present? ? @year : Date.today, {:include_blank => "Select Year"..%>
</div>
<div class="field">
<%= select_tag :week, options_for_select([["Week 1", 1], ["Week 2", 2], ["Week 3", 3], ["Week 4", 4], ["Week 5", 5]], params[:week]), class: 'ui dropdown' %>
</div>
</div>
<div class="field text-center">
<%= submit_tag("Search", :id => "button", :class => "ui button basic green" %>
</div>
<% end %>
amb_chart_records_controller.rb
def index
if params[:commit] == "Previous" || params[:commit] == "Next"
now = Date.new(params[:current_year].to_i, params[:current_month].to_i)
if params[:commit] == "Previous"
target_date = now - 1.month
else
target_date = now + 1.month
end
elsif params.has_key?(:select)
target_date = Date.new(params[:select][:year].to_i, params[:select][:month].to_i, 1)
week_numb = params[:select][:week].to_i
else
target_date = Date.new(Date.today.year, Date.today.month, 1)
week_numb = 1
end
@year = target_date.year.to_i
@month = target_date.month.to_i
@week_numb = target_date.cweek.to_i
@facilities = Facility.where(is_ambulatory_chart_enabled: true)
@ambulatory_chart_records = @facilities.includes(:amb_chart_records).order(record_date: :desc).where(:record_date => target_date..target_date + 1.month)
end
def week(year, month, week_number)
Date.new(year, month, 7 * week_number - 6)
end
要在 Ruby 中獲得一周的開始,請使用Date#commercial方法:
irb(main):019:0> Date.commercial(2020, 25, 1)
=> Mon, 15 Jun 2020
這假設周從星期一開始。 如果您需要從星期日開始的 ISO 周,只需使用#change將日期更改為一天:
irb(main):020:0> Date.commercial(2020, 25, 1).change(day: -1)
=> Tue, 30 Jun 2020
如果您想根據周數進行查詢,一種方法是在開始日期和結束日期之間傳遞一個范圍:
w_start = Date.commercial(year, week_number, 1)
w_end = Date.commercial(year, week_number, 7)
Model.where(some_column: w_start..w_end)
作為一個較少多語言的解決方案,您還可以使用數據庫中的日期函數從日期列中提取周數:
# Postgres
User.where('EXTRACT(week from created_at)::int = ?', 26)
.where('EXTRACT(year from created_at)::int = ?', 2020)
# MySQL
User.where('WEEK(created_at) = ?', 26)
.where('YEAR(created_at) = ?', 2020)
如果您使用基於周的分組或聚合,這將更加有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.