9

终于设法让我的应用程序列出特定日期下的工作。我现在正在寻找一种仅显示过去 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 天的工作,或者在控制器中定义它会更好吗?

谢谢!

4

2 回答 2

25

在控制器中做会更好。您在视图中放入的逻辑越少越好。

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

于 2012-08-02T17:12:23.143 回答
4

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

# 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 我可以用来获取你的记录。

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

于 2012-08-02T17:14:38.163 回答