簡體   English   中英

如果Ruby on Rails中的數據值超過一個,則僅顯示一次

[英]Ruby on Rails only show data value once if there are more than one of the same

在我的ruby on rails應用程序中,我當前正在顯示通過以下方式顯示每部電影的日期和時間:

<% if not @film.showings.blank? %>
    To book click on a time below:</br>
    <% @film.showings.each do |showing| %>
        <%= showing.show_date.strftime("%A %e %B %Y") %>@ <%= showing.show_time.strftime("%H:%M") %><br>            
    <% end %>
<% else %>
    <p>There are currently no showings for this film.</p>
<% end %>

這將顯示如下數據:

Sunday 25 January 2015 @ 12:00
Sunday 25 January 2015 @ 16:00
Monday 26 January 2015 @ 11:00
Monday 26 January 2015 @ 22:00
Tuesday 27 January 2015 @ 22:00
Wednesday 28 January 2015 @ 11:00
Wednesday 28 January 2015 @ 12:00
Wednesday 28 January 2015 @ 16:00
Wednesday 28 January 2015 @ 19:30

但是我想做的是,如果重復日期,那么它只會顯示一次並重復一次時間,例如,日期為2015年1月25日,星期日將顯示為:

Sunday 25 January 2015 @ 12:00 16:00

您應該按日期和參加時間對記錄進行分組。

<% if not @film.showings.blank? %>
To book click on a time below:</br>
<% @film.showings.group_by{|showing| showing.show_date.strftime("%A %e %B %Y") }.to_a.each do |showing| %>
    <%= showing.first %>@ <%= showing.last.map{|s| s.show_time.strftime("%H:%M")}.join(' ')  %><br>            
<% end %>
<% else %>
    <p>There are currently no showings for this film.</p>
<% end %>

您可以在助手或裝飾器中放置這樣的函數(如果您正在使用它們)。 我假設您通過@file.showings 這將返回您希望在視圖和顯示中循環的數組。

def show_times(showings)
  showings.each_with_object({}) do |showing, hash|
    key = showing.show_date.strftime("%A %e %B %Y")
    hash[key] ||= []
    hash[key] << showing.show_time.strftime("%H:%M")
  end.map do |date, times|
    "#{date} @ #{times.join(' ')}"
  end
end

給定日期時間對象數組,您可以使用以下代碼提取顯示日期和時間的嵌套哈希。 它可能最好地存在於Film模型中。

def showings_hash
  showings.pluck(:show_time).map {|datetime| datetime.to_date}.uniq.map{|date| {date => dates.select{|datetime| date == datetime.to_date}}}
end

返回:

- 2015-01-12:
  - !ruby/object:DateTime 2015-01-12 18:00:00.000000000 Z
  - !ruby/object:DateTime 2015-01-12 19:00:00.000000000 Z
  - !ruby/object:DateTime 2015-01-12 20:00:00.000000000 Z
- 2015-01-13:
  - !ruby/object:DateTime 2015-01-13 20:00:00.000000000 Z

然后,您可以像這樣遍歷視圖中的每個顯示日期:

<% @film.showings_hash.each do |showing_date| %>
  <li>
    <%= showing_date %>
    <% showing_date.each do |showtime| %>
      <%= showtime.strftime("%H:%M") %>
    <% end %>
  </li>
<% end %>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM