如何计算Ruby中的特定created_at日期?

时间:2011-06-13 11:55:01

标签: ruby-on-rails ruby-on-rails-3

我有一个关系课程,我想吐出一个用户在特定日期范围内(今天和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>

2 个答案:

答案 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>