2012-04-19 62 views
2

爲了避免構建複雜的動態SQL查詢,我希望能夠在我的條件下傳遞nil值,並忽略這些值。 ActiveRecord是否支持?如何獲得ActiveRecord查詢以忽略無條件?

這裏是一個例子。

event = Event.find(:all, :conditions => { 
              :title  => params[:title], 
              :start_time => params[:start_time], 
              :end_time => params[:end_time] 
             }).first 

在這種特殊情況下,如果PARAMS [:START_TIME]設爲零,ActiveRecord的將搜索那些有自己的start_time設置爲null事件。相反,我希望它忽略start_time。我怎麼做?

回答

6

您不必「創建複雜的動態SQL查詢」來執行您所需的操作。只需單獨構造您的條件散列,並在創建時或創建散列之後排除空值。

conditions = {} 
conditions[:title] = params[:title] unless params[:title].blank? 
conditions[:start_time] = params[:start_time] unless params[:start_time].blank? 
conditions[:end_time] = params[:end_time] unless params[:end_time].blank? 

conditions = {:title => params[:title], :start_time => params[:start_time], :end_time => params[:end_time]} 
conditions.delete_if {|k,v| v.blank? } 

conditions = params.reject {|k,v| !([:title, :start_time, :end_time]).include?(k) } 

但如果鍵實際上符號是最後一種形式纔有效。在Rails中,參數散列是一個HashWithIndifferentAccess,它允許您以文本鍵的形式訪問它們。當然,如果需要,您可以使用鍵數組中的文本值。

,然後查詢您的預建條件的哈希:

event = Event.find(:all, :conditions => conditions).first