Rails中如何在each循环内计算记录的日期天数差
解决Rails视图中计算相邻记录日期差的问题
我来帮你搞定这个在each循环里计算日期差的需求~首先咱们得明确:因为要算按降序排列的相邻记录之间的天数差,所以第一步得确保数据是按date字段降序排好的,然后再处理差值计算。下面给你两种可行的方案,推荐第一种更符合Rails的MVC规范:
方案一:控制器预处理(推荐)
把计算逻辑放在控制器里,视图只负责展示,这样代码更清晰也更好维护。
- 先在控制器里给数据排序,并计算每条记录和上一条的天数差:
# 替换成你的实际模型名称,比如SalaryRecord之类的 @search = YourModel.order(date: :desc) previous_record_date = nil @search.each do |record| if previous_record_date.present? # 因为是降序,上一条的date比当前大,所以用previous减当前得到正数天数 record.days_diff = (previous_record_date - record.date).to_i else # 第一条记录没有上一条,你可以设为0或者显示空/横杠,这里用0举例 record.days_diff = 0 end previous_record_date = record.date end
- 然后在视图里直接调用这个计算好的属性:
<div id="searchResult"> <table class="table"> <thead> <tr> <th>Guard Name</th> <th>Client Name</th> <th>Salary</th> <th>Transfer Date</th> <th>Days</th> </tr> </thead> <tbody> <% @search.each do |f| %> <tr> <td><%= f.guard.try(:name) %></td> <td><%= f.client.try(:name) %></td> <td><%= f.sallary %></td> <td><%= f.date.strftime("%Y-%b-%d") %></td> <td><%= f.days_diff %></td> <!-- 直接用计算好的差值 --> </tr> <% end %> </tbody> </table> </div>
方案二:视图内直接处理(快速实现)
如果不想改动控制器,也可以在视图里用each_with_index来跟踪上一条记录:
<div id="searchResult"> <table class="table"> <thead> <tr> <th>Guard Name</th> <th>Client Name</th> <th>Salary</th> <th>Transfer Date</th> <th>Days</th> </tr> </thead> <tbody> <% @search.each_with_index do |f, index| %> <tr> <td><%= f.guard.try(:name) %></td> <td><%= f.client.try(:name) %></td> <td><%= f.sallary %></td> <td><%= f.date.strftime("%Y-%b-%d") %></td> <td> <% if index > 0 %> <!-- 取上一条记录的date减去当前date,转成整数得到天数 --> <%= (@search[index-1].date - f.date).to_i %> <% else %> <!-- 第一条记录没有前序,显示横杠或者你想要的内容 --> <%= '-' %> <% end %> </td> </tr> <% end %> </tbody> </table> </div>
注意事项
- 确保你的模型里
date字段是Date或DateTime类型,如果是字符串的话,需要先转成Date对象,比如Date.parse(f.date),但最好一开始就把字段类型设对哦。 - 如果是DateTime类型,减法得到的是秒数,需要除以86400转成天,比如
((@search[index-1].date - f.date)/86400).to_i,不过Date类型直接减就是天数啦。
内容的提问来源于stack exchange,提问作者Santosh Aryal
相关产品推荐
相关产品推荐

