仅显示过去30天内的对象

时间:2012-08-02 16:57:48

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

终于设法让我的应用程序列出特定日期下的作业。我现在正在寻找一种方法来仅显示过去30天内创建的工作。

目前,我展示工作的方法是局部的,看起来像这样:

 <% @jobs.group_by{|x| x.created_at.strftime("%d %b. %Y")}.each do |date,jobs_on_that_date| %>

 <section class="date">
   <%= date %>
 </section>

 <section id="top-job">
   <% jobs_on_that_date.each do |job| %>
    <section id="job-wrapper">
      <%= link_to url_with_protocol(@link.job_url), :target => '_blank' do %>
      <section id="job">
        <%= job.title %> - <%= job.company %>
        <%= job.salary %>
        <%= job.location %> 
        <%= job.job_type %>
    </section>
 </section> 
<% end %>
 <% end %>
 </section>
 <% end %>

是否可以集成仅在视图中显示过去30天的作业或者在控制器中定义它更好?

谢谢!

2 个答案:

答案 0 :(得分:18)

最好在控制器中完成。你在视图中放置的逻辑越少越好。

假设@jobs是ActiveRecord查询的结果,@jobs = @jobs.where('created_at > ?', 30.days.ago)听起来就像您想要的查询。

答案 1 :(得分:3)

我认为最好的方法是在模型中使用范围。然后你的控制器可以使用它。

# app/models/job.rb
class Job < ActiveRecord::Base
  # ...
  scope :recent, lambda{ where(['created_at > ?', 30.days.ago]) }
  # ...
end

# app/controllers/jobs_controller.rb
class JobsController < ApplicationController
  def show
    @jobs = Job.recent.group_by(&:created_at)
  end
end

# app/views/jobs/show.html.erb
<% @jobs.each do |date,jobs_on_that_date| %>

 <section class="date">
   <%= date.strftime("%d %b. %Y") %>
 </section>

 etc...

<% end %>

稍微好一点的处理控制器的方法&amp;视图将是:

# app/controllers/jobs_controller.rb
class JobsController < ApplicationController
  helper_method :recent_jobs

  def show
    # just render...
  end

  protected

  def recent_jobs
    @_jobs ||= Job.recent.group_by(&:created_at)
  end
end

# app/views/jobs/show.html.erb
<% recent_jobs.each do |date,jobs_on_that_date| %>

 etc...

<% end %>

所以没有实例变量复制,你有一个不错的控制器AP 我用来获取你的记录。

您还可以考虑使用装饰器来包装作业对象并在那里提供日期格式化逻辑。