2011-03-27 4 views
0
#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") 

Je veux être en mesure d'obtenir les articles par année, ou année et mois, ou année et mois et jour, avec genre éventuellement à la fin de l'un de ceux. Est-ce que je peux faire ceci dans une déclaration ou ai-je besoin de blocs? Aussi, je veux être en mesure d'obtenir tous les articles dans un genre spécifique, mais je pense que je dois le faire dans une action séparée? Merci!Comment utiliser les attributs optionnels pour sélectionner des articles?

MISE À JOUR

Je fini par utiliser la gemme metawhere plus une méthode pour construire ma date:

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 

Cela a réduit le nombre d'appels sql à un et tout faire paraître jolie. Merci de votre aide!

Répondre

1

Vous pouvez utiliser has_scope gemme pour définir des champs à appliquer à votre collection s'il sont params correspondant à la demande. Vous pouvez trouver has_scope ici. Une autre alternative pourrait être les gemmes meta-where et meta-search. Vous pouvez trouver une explication sur la façon de les utiliser here.

0

Vous pouvez faire quelque chose comme ceci:

@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] 
+0

J'ai commencé avec quelque chose comme ça, mais ce n'était pas assez DRY – illogikal

Questions connexes