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")

年、年と月、または年と月と日で記事を取得できるようにしたいのですが、それらのいずれかの末尾にジャンルを指定することもできます。これを1つのステートメントで実行できますか、それともifブロックが必要ですか?また、特定のジャンルのすべての記事を取得できるようにしたいのですが、別のアクションでそれを行う必要があると思いますか?ありがとう!

アップデート

私はmetawheregemに加えて、日付を作成する方法を使用することになりました。

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呼び出しの数が1つに減り、すべてがきれいに見えます。ご協力いただきありがとうございます!

4

2 に答える 2

1

has_scopeリクエストに一致するパラメータがある場合、gemを使用して、コレクションに適用されるいくつかのスコープを定義できます。ここでhas_scopeを見つけることができます。

他の選択肢は、meta-wheremeta-search宝石である可能性があります。それらの使用方法の説明はここにあります。

于 2011-03-27T10:24:24.440 に答える
0

あなたはこのようなことをすることができます:

@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]
于 2011-03-27T07:08:00.933 に答える