0

タイムスタンプが付けられた多数のレコードを保持するモデル、ターゲットがあります。対応するコントローラーで、次のようにして、これらのレコードの月を一覧表示します。

models/target.rb

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

controllers/targets_controller.rb

@records = Target.find :all

views /targets/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(上記で定義された名前付きルートの正規表現のため、月の先行ゼロはオプションであることに注意してください)

最後に、で、前に定義したnamed_scopesを使用するようTargetsControllerにアクションを設定します。index

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