2010-10-18 53 views
1

在Rails 3中,我創建了一個搜索表單,它在Models文件中查找條件。Rails做條件查找?

@projects = find(:all, 
       :select => 'projects.*', 
       :conditions => ['name = ?', search_name] 
       ).first 

如果在搜索表單(search_name)中提供了名稱,這將很有用。問題是如果search_name是空白的,Rails錯誤(不能說我怪它)...

什麼是聰明的方式來處理這種情況?我想,如果search_name爲空,則不會出錯,但會返回所有內容。

對此提出建議?謝謝!

回答

5

你可以創建一個範圍來處理這個。在你的項目模型,添加類似:

scope :search_by(name), lambda{|name| first.where(:name => name) unless name.blank?} 

然後在你的控制器,只需撥打:

Project.search_by(params[:search]) 

編輯:

如果需要檢索算法用於多個字段,你可以適應範圍:

範圍:search_by(name),lambda {| name | first.includes(:owner).where(「projects.name LIKE?OR owners.name LIKE?」,name,name)除非name.blank?}

+0

非常優雅。什麼是我的項目搜索是由多個領域像(所有者,名稱,創建日期),只有名稱是可選的? – AnApprentice 2010-10-18 21:03:37

+0

它應該不是「scope:search_by(name),lambda {| name | first.where(:name => name)unless name.blank?}」? – ipsum 2010-10-18 21:09:18

+0

您的權利ipsum糾正! – Yannis 2010-10-18 21:13:27

3
if search_name.blank? 
    @projects = Project.order(:name) 
else 
    @projects = Project.where(:name => search_name) 
end 
+0

我認爲,但是也許有人想到了一個更清潔的Rails類型解決方案? – AnApprentice 2010-10-18 19:57:09

+0

'@projects =(search_name.blank?Project.order(:name):Project.where(:name => search_name))':) – 2010-10-18 20:49:28

+0

我會說在這裏使用三元組相當醜陋,但如果你想要一個單一的元素,班輪,去吧。 – bensie 2010-10-19 03:08:44

1

的乾淨的方式是使用延遲加載與新的ActiveRecord功能是這樣的:

@projects = Project.order(:名稱) @projects = @ projects.where(:名稱=> SEARCH_NAME )if search_name

您可以按照這種方式添加儘可能多的條件。他們不會被執行,直到你需要結果(無論是@ projects.all還是@project.each等)。

+0

延遲加載是理想的,但在這種情況下,它也會在名稱列上執行ORDER BY,這在搜索中可能不合需要。非常新的Rails大師,他們已經添加了except()方法,它可以用於.except(:order)... – bensie 2010-10-19 03:11:06