我有一个关系课程,我想吐出一个用户在特定日期范围内(今天和4周前)有多少朋友的列表。
我在html.erb中尝试了以下内容,但它似乎无法正常工作:
<table>
<% rightnow = DateTime.now.to_i %>
<% twentyeight = Time.at(rightnow).to_time - 28.days %>
<% twght = twentyeight.to_i %>
<% (twght..rightnow).step(1.day).map do |time| %>
<tr><th><%= Time.at(time).strftime("%a %b %y") %></th></tr>
<tr><td><%= Relationship.where(:follower_id => @user.id, :created_at => from .. to time ).count %></td></tr>
</table>
我怀疑答案可能与此相符,但我不知道如何实施...... Ruby count items by date
另外,由于我还在努力解决MVC问题,我该如何清理代码呢?我尝试在users_controller中创建一个方法,但无法成功调用它。
干杯。
编辑:
这是另一种尝试,它起作用。欢迎反馈:
<tfoot>
<% before = DateTime.now - 28.days%>
<% following = Relationship.where(:followed_id => @user.id) %>
<tr>
<% before.step(before + 28, 1) do |time| %>
<th><%= time.strftime("%a %b #{time.day.ordinalize}") %></th>
<% end %>
&lt;%before.step(在+ 28,1之前)do | time | %GT;
<td>
<%= following.all(:conditions => ["created_at < ?", time.end_of_day]).count %>
</td><% end %>
</tr>
</tbody>
</table>
答案 0 :(得分:1)
也许你应该尝试下一步:
在您的控制器中:
@relationships = Relationship.where("created_at BETWEEN ? AND ?", your_start_date, your_end_date)
然后在您的视图中,您可以遍历@relationships并填写演示文稿
* your_start_date - 可以是Time.now - 28.days
答案 1 :(得分:1)
我要跳过我们弹出“为什么?”的部分。堆。因此,为了论证,我们假设您正在查看Relationships控制器的索引视图。大多数代码都属于控制器,所以让我们从简单的案例开始:
class RelationshipsController < ApplicationController
before_filter :set_user #whatever you do to load your currently logged in user
def index
@relationships = @user.relationships.where(:created_at => 28.days.ago..Date.today)
end
end
在您看来:
<table>
<tr><th><%= Time.at(time).strftime("%a %b %y") %></th></tr>
<tr><td><%= @relationships.count %></td></tr>
</table>
这将显示您在过去28天内创建的关系数量。这不会让你进入你的运行计数,所以让我们通过向你的模型添加一个方法来重构设计:
class Relationship < ActiveRecord::Base
#... skip other stuff
def self.relationship_count_for_days(start_date, end_date)
where(:created_at => start_date..end_date).count
end
end
那么您的观点将变为:
<table>
<% 28.downto(1) do |days_ago| %>
<tr><th><%= days_ago.days.ago.to_time.strftime("%a %b %y") %></th></tr>
<tr><td><%= @relationships.relationship_count_for_days(28.days.ago, days_ago.days.ago) %></td></tr>
<% end
</table>