2010-10-26 42 views
5

我希望我的代碼做兩件事情,目前沒有做幫助軌活動記錄查詢(如子句)

@students = Student.where(["first_name = ? OR middle_name = ? OR last_name = ?", params[:query].split]) 
  1. 工作。 (它表示我應該傳遞4個參數,但我希望用戶能夠鍵入單詞並通過這些單詞在每個字段上找到並返回任何匹配)

  2. 實際上使用Like子句而不是剛性等號子句。

請幫忙。

回答

8

這看起來像是一個更適合使用搜索而不是SQL的問題。你有沒有考慮過像thinking sphinxact as ferret(solr可能會矯枉過正)。

...如果你必須這樣做在SQL中,你可以建立一個查詢是這樣的:

cols = ['first_name', 'last_name', 'middle_name'] 
query = 'John Smith' 
sql_query = cols.map{|c| query.split.map{|q| "#{c} like '?'"}}.join(' OR ') 
sql_query_array = query.split * cols.count 
Student.where(sql_query, sql_query_array) 
+2

思維獅身人面像+1, – 2010-10-26 20:13:44

+1

注意SQL注入。 – Reactormonk 2010-10-26 20:34:55

+0

好點。意思是它只是一個例證,但我更新了這個例子,以便更安全......主要是我建議使用搜索。 – njorden 2010-10-26 20:55:12

4

我與以前的意見同意,如果你需要做搜索,你應該看看像Solr或獅身人面像。

無論如何,這應該會幫助你。

def search 
    query = params[:query].split.map {|term| "%#{term}%" } 
    sql = "first_name LIKE ? OR middle_name LIKE ? OR last_name LIKE ?" 

    @students = Student.where([sql, *query]) 
end 

答案第1步是使用Ruby的真棒小功能,稱爲「圖示符」,它允許你把一個數組,並評估它的參數列表。

第2步的答案是僅僅處理從參數中取回的查詢字符串,並將其轉化爲您可以與LIKE運算符一起使用的東西。我從Railscasts Simple Search Form episode基本上偷了這個。

+0

只是試圖使用「LIKE」操作符,並不記得如何,你的答案幫了我不少。謝謝,亞當。 – Tass 2011-10-07 16:02:03

1

我不知道,如果你希望所有字段進行搜索同一術語如果的話,那麼你可以這樣做:

where("first_name LIKE :term OR middle_name LIKE :term OR last_name LIKE :term", { term: "%#{params[:term]}%"}) 

無需任何瘋狂的splitmap或其他任何,這只是直線ActiveRecord