Как использовать необязательные атрибуты для выбора статей?

#routes.rb
get "/:year(/:month(/:day))(/:genre)" => "archives#index", :constraints => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/ }

#archives_controller.rb
def index
@articles = Article.all(params[:year, :month, :day, :genre],:order => "created_at DESC")

Я хочу иметь возможность получать статьи по годам, или годам и месяцам, или годам, месяцам и дням, с указанием жанра в конце любого из них. Могу ли я сделать это в одном выражении или мне нужны блоки if? Также я хочу получить все статьи в определенном жанре, но я думаю, мне нужно сделать это в отдельном действии? Спасибо!

ОБНОВИТЬ

В итоге я использовал жемчужину метагде плюс метод для создания моей даты:

def index
  date_builder
  @articles = Article.where(:created_at.matches % @date, :genre.matches % @genre).order("created_at DESC")
  respond_to do |format|
    format.json { render :json => @articles }
    format.xml  { render :xml => @articles }
    format.html
  end
end

def date_builder
  @date = ""
  @date += params[:year] if !(params[:year].nil?)
  @date += "-" + params[:month] if !(params[:month].nil?)
  @date += "-" + params[:day] if !(params[:day].nil?)
  @date += "%"
end

Это уменьшило количество вызовов sql до одного и сделало все красивым. Спасибо за вашу помощь!


person illogikal    schedule 27.03.2011    source источник


Ответы (2)


Вы можете использовать has_scope gem для определения некоторых областей, которые будут применяться к вашей коллекции, если в запросе есть соответствующие параметры. Вы можете найти has_scope здесь.

Другой альтернативой могут быть драгоценные камни meta-where и meta-search. Вы можете найти объяснение того, как их использовать здесь.

person Fran    schedule 27.03.2011

Вы можете сделать что-то вроде этого:

@articles = Article.where(:year => params[:year], :month => params[:month]).order("created_at DESC")
@articles = @articles.where(:day => params[:day]) if params[:day]
@articles = @articles.where(:genre => params[:genre]) if params[:genre]
person DanneManne    schedule 27.03.2011
comment
Я начал с чего-то подобного, но это было недостаточно СУХО - person illogikal; 29.03.2011