2010-07-09 61 views
1

現在我從表單輸入一些數據,我有一個代碼來搜索數據庫輸入幾個參數作爲輸入條件。現在,如果其中一個參數爲空(即)該字段未選中,我需要用某些說*代替該參數,以便搜索查詢不受影響。我會怎麼做?在查找中結合條件。 (Rails)

@report = Problem.find(:all, :conditions => ["problems.cause_id = ? and problems.location_id = ? and problems.device_id = ? and problems.priority_id = ?", Report.find_by_id(params[:id]).cause_id, Report.find_by_id(params[:id]).location_id, Report.find_by_id(params[:id]).device_id, Report.find_by_id(params[:id]).priority_id]) 

回答

1

這將是最好不要有這種條件在所有比使用*。在這種情況下,所有比較運算符都是「=」,這很簡單。這意味着你可以使用散列形式的條件。當您加載相同的報表對象3次或4次時,您的代碼效率也很低。你關於其中一個參數爲null的問題沒有意義,因爲這個原因:你只是一次又一次地使用相同的參數。你也設置了一個稱爲@report的變量,它是一個令人困惑的問題對象。

@report = Report.find_by_id(params[:id]) 
conditions = {:cause_id => @report.cause_id, :location_id => @report.location_id, :device_id => @report.device_id, :priority_id => @report.priority_id} 
conditions.delete_if{|k,v| v.blank?} 
@problem = Problem.find(:all, :conditions => conditions) 
+0

感謝它的一個非常整潔的解決方案。你之前在railsforums上也幫過我,所以再次感謝 – Prateek 2010-07-10 09:38:59

1
rep = Report.find_by_id(params[:id]) 
cause = rep.cause_id ? rep.cause_id : '*' 
location = rep.location_id ? rep.location_id : '*' 
device = rep.device_id ? rep.device_id : '*' 
priority = rep.priority_id ? rep.priority_id : '*' 
@report = Problem.find(:all, 
         :conditions => ["problems.cause_id = ? and 
             problems.location_id = ? and 
             problems.device_id = ? and 
             problems.priority_id = ?", 
             cause, location, 
             device, priority 
             ] 
         ) 
+0

哇,現在看起來好多了,但是不是空問題仍然存在?即如果rep.cause_id爲空,該怎麼辦? – Prateek 2010-07-09 14:38:10

+0

Salil編寫它的方式,如果它爲空,那麼該字段被替換爲'*'。採取行'cause = rep.cause_id?例如,rep.cause_id:'*''這基本上是一個條件語法,其中如果rep.cause_id存在,則爲cause = rep.cause_id;如果不存在,則爲cause ='*'。事實上,他正如你所說的那樣回答了問題,用*替換查詢,如果它們爲空。 – Karl 2010-07-09 16:30:34

+0

我不明白該代碼的工作,所以感謝解釋以及代碼。 – Prateek 2010-07-10 09:37:32