【问题标题】:How do I group content according to date (Rails)如何根据日期对内容进行分组(Rails)
【发布时间】:2023-04-11 09:26:01
【问题描述】:

我正在尝试将属于同一日期的内容组合在一起进行显示,这样该日期只会按时间顺序发布一次。

类似:

2009 年 10 月 14 日
项目 3
第3项内容

第 2 项
第2项内容

2009 年 10 月 13 日 项目 1
第3项内容

如何在视图中显示它? (假设@items 是从包含所有项目的控制器传递过来的)

我已经尝试过 group_by,但我无法让它工作,因为它似乎是按天本身的价值而不是与月份一起排列的。

有问题的代码:http://github.com/davidchua/Political-Watch/blob/master/app/views/items/index.html.erb

要查看实时部署中的问题,请访问http://political-watch.org

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:
items.group_by{ |item| item.created_at.to_date }

【讨论】:

  • 太棒了! - What kind of sorcery is this?
【解决方案2】:

1) 将 app/controllers/items_controller.rb 的第 5 行替换为:

  @items = Item.all(:order => "date DESC")

2) 将 app/views/items/index.html.erb 的第 3-14 行替换为:

<%  date = 1.day.from_now(@items.first.date.to_date) rescue nil # increment the day
    @items.each do |item| 
      if date > item.date.to_date 
        date = item.date.to_date %>
        <div style="background: #81BEF7;margin-top: 5px; margin-bottom: 5px;" class="rounded"><b><span style="padding: 5px"><%=h date %></span></b></div>
      <%end%>

      <p>
        <i><%=h item.time %> - </i>
         <%= link_to "#{item.title}", item.link %><br>
        <a href="/items/<%=item.id%>"><span class="subtext" style="margin-left: 55px">by <%= item.user.username %> | <%=item.comments.count%> comments </span></a>
    </p>

<%  end # end for items_each%>

在这种方法中,您使用数据库进行排序和简单的分组比较。

PS:我认为将数据库列命名为“日期”不是一个好主意。在某些数据库中,“日期”是保留关键字。

【讨论】:

  • 这似乎是对的,但是我如何在没有时间的情况下比较日期(日、月、年),因为如果一个项目在前一个项目之后一分钟或一秒发布,它将为其生成一个新的日期标题。
  • 调用:'item.date.to_date' 删除了 'datetime' 字段中的时间部分。所以你应该看到按日期而不是日期时间分组的行。
  • 例如:检查这个例子:k = (1..10).collect{|i| Time.now + (i*3).hours}; p k; j = k.collect {|d| d.to_date}; p j 查看打印的两个数组。第一个有时间部分,第二个没有。
  • 谢谢!我想我已经修复了该代码中的那个小错误,日期应该是:第 4 行中的 date = item.date.to_date 现在可以正常工作了。谢谢:)
【解决方案3】:

添加以下迁移:

class AddIndexToItemsStartDate < ActiveRecord::Migration
  def change
    add_index :items, :start_date
  end
end

控制器:

@items = Item.where("start_date >= ?", Time.zone.now.beginning_of_day)
@items_by_day = @items.group_by { |t| t.start_date.beginning_of_day }

以漂亮的显示查看:

<% @items_by_day.sort.each do |day, items| %>
<h2><%= day.strftime("%d %B %Y") %></h2>
<table class="table table-striped">
    <thead>
        <tr>
            <th>Item</th>
            <th></th>           
       </tr>
    </thead>
    <% for item in items %>
    <tbody>
        <tr>
            <td><%= item.item_id %></td>
            <td><%= link_to 'Delete', item, method: :delete, data: { confirm: 'Are you sure?' } %></td>
        </tr>
    </tbody>
    <% end %>
</table>
<% end %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 2016-12-08
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多