Rails: база данных записей с пользовательским маршрутом ...? - PullRequest
0 голосов
/ 24 апреля 2009

У меня есть модель, цель, которая содержит несколько записей с метками времени. На соответствующем контроллере я перечисляю месяцы этих записей, выполняя следующее:

In models / target.rb

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

In controllers / target_controller.rb

@records = Target.find :all

В просмотры / цели / index.html.haml

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

Это прекрасно работает для перечисления доступных месяцев для моих записей. Далее я хочу иметь возможность щелкнуть по месяцу и получить отчет обо всех записях за этот месяц по следующему пути, созданному с указанием года и месяца: / target / 2009/04

Как бы я это сделал?

1 Ответ

2 голосов
/ 24 апреля 2009

Добавьте несколько именованных областей в модель 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 }

& ndash; Вы можете использовать этот маршрут в своем представлении следующим образом:

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

(обратите внимание, что начальный ноль для месяца является необязательным из-за регулярного выражения :requirements в названном маршруте, определенном выше)

Наконец, в вашем TargetsController установите действие index, чтобы использовать именованные_области, определенные ранее:

def index
  @records = Target.by_year(params[:year]).by_month(params[:month])
  .
  .
  .
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...