2012-08-02 72 views
4

最终设法让我的应用在特定日期下列出工作。我现在正在寻找一种方法来显示过去30天内创建的职位。仅显示过去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天的的视图的工作或会更好在控制器中定义这个?

谢谢!

回答

14

在控制器中执行会更好。你放在视图中的逻辑越少越好。

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

+0

这工作完全谢谢! – 2012-08-03 09:46:18

1

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

# 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 %> 

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

# 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 我用让你的记录。

您也可以考虑使用装饰器来包装作业对象并在其中提供日期格式逻辑。

相关问题