如何使用可选属性选择文章?

时间:2011-03-27 04:36:01

标签: ruby-on-rails ruby-on-rails-3 rails-routing

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

我希望能够按年份,年份和月份,或年份,月份和日期获取文章,其中任何类型的结尾都可以选择。我可以在一个声明中这样做,还是我需要块?此外,我希望能够获得特定类型的所有文章,但我认为我需要在单独的操作中执行此操作?谢谢!

更新

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

2 个答案:

答案 0 :(得分:1)

如果请求中存在匹配的参数,则可以使用has_scope gem来定义要应用于集合的某些范围。你可以在这里找到has_scope

其他替代方案可能是meta-wheremeta-search宝石。您可以找到有关如何使用它们的说明here

答案 1 :(得分: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]