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

我希望能够按年、年和月、或年月和日获取文章,并且可以在任何这些的末尾选择流派。我可以在一个语句中执行此操作还是需要 if 块?此外,我希望能够获得特定类型的所有文章,但我认为我需要在单独的操作中做到这一点?谢谢!

更新

我最终使用了 metawhere gem 加上一个方法来构建我的日期:

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 调用的数量减少到一个,并使一切看起来都很漂亮。谢谢你的帮助!

4

2 回答 2

1

如果请求中有匹配的参数,您可以使用has_scopegem 定义一些适用于您的集合的范围。你可以在这里找到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 回答