2012-08-13 36 views
0

我正在处理事件应用程序,我想根据查询字符串中的3个参数位置或starts_at或ends_at来过滤事件。查询字符串中可以有任何一个,两个或所有参数。在我使用if-else声明我需要使6个案件,这将使我的代码笨拙。而是我在想实现的东西是这样的:Rails - 根据查询字符串中的参数数获取结果

class EventsController < ApplicationController 
    def index 
    unless params.empty? 
     unless params[:location].nil? 
     @events = Event.where("location = ?", params[:location])  
     end 

     unless params[:starts_at].nil? 
     unless @events.empty? 
      @events = @events.where("start_date = ?", params[:start_date])  
     else 
      @events = Event.where("Date(starts_at) = Date(?)", params[:starts_at]) 
     end 
     end 
     unless params[:ends_at].nil? 
     unless @events.empty? 
      @events = @events.where("end_date = ?", params[:end_date])  
     else 
      @events = Event.where("Date(ends_at) = Date(?)", params[:ends_at]) 
     end 
     end 
    end 
    end 
end 

但由于这个代码不工作,其中查询DOEN不是一个阵列上运行。可有人建议我一些这方面的解决方案..

回答

2

您应该能够直接传递您的params散列where,并且将根据键和值形成正确的SQL该散列:

Event.where(params) 

在控制台的一个例子:

1.9.3p194 :001 > puts Example.where(:location => 'here', :started_at => '2012-08-13').to_sql 
SELECT "examples".* FROM "examples" WHERE "examples"."location" = 'here' AND "examples"."started_at" = '2012-08-13' 
0

尝试以下

def index 
    unless params.empty? 
     where_array, arr = [], [] 
     if params[:location] 
     where_array << "location = ?" 
     arr << params[:location] 
     end 
     if params[:starts_at] 
     where_array << "start_date = ?" 
     arr << params[:starts_at] 
     end 
     if params[:ends_at] 
     where_array << "end_date = ?" 
     arr << params[:ends_at] 
     end 
     @events = arr.blank? ? [] : Event.where([where_array.join(" AND "), *arr]) 
    end 
    end 
相关问题