0

我有一个模型,目标,它包含许多带时间戳的记录。在相应的控制器上,我通过执行以下操作列出了这些记录的月份:

模型/target.rb

def month
   self.recorded_on.strftime('%B')
end

控制器/targets_controller.rb

@records = Target.find :all

视图/目标/index.html.haml

%ul
  - @records.group_by(&:month).sort.each do |month, data|
    %li= link_to month, ''

这一切都非常适合列出我拥有的记录的可用月份。接下来,我希望能够单击月份并获取该月所有记录的报告,在以下路径生成年份和月份:/targets/2009/04

我该怎么做?

4

1 回答 1

2

将一些命名范围添加到您的Target模型中,以支持按年和月号查找。就像是:

class Target < ActiveRecord::Base
  named_scope :by_month,
    lambda { |month| { :conditions => ['MONTH(recorded_on) = ?',
                        month] }}

  named_scope :by_year,
    lambda { |year| { :conditions => ['YEAR(recorded_on) = ?', year] }} 
  .
  .
  .
end

(注意这里的条件是使用 MySQL 语法。)

假设您使用的是 RESTful 路由,请在文件中设置如下命名路由config/routes.rb(确保在默认路由之前声明它):

map.targets_by_month '/targets/:year/:month', :controller => 'targets',
                :requirements => { :year => /\d{4}/, :month => /\d{1,2}/ },
                :conditions => { :method => :get }

—您可以像这样在视图中使用此路由:

<%= link_to 'Show April 2009 Targets', targets_by_month_path('2009', '04') %>

(请注意,月份的前导零是可选的,因为:requirements上面定义的命名路由中的正则表达式)

最后,在您的 中TargetsController,设置index操作以使用之前定义的 named_scopes:

def index
  @records = Target.by_year(params[:year]).by_month(params[:month])
  .
  .
  .
end
于 2009-04-24T18:28:19.133 回答