2012-08-13 54 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 
相關問題