2011-06-13 157 views
3

我是相當新的,並且在Rails中搜索數據庫。我有一個模型和數據庫,其中包含'name'屬性下的名稱列表。我希望能夠將搜索關鍵字輸入到單個搜索字段中,並且此輸入可以是一個字或兩個字或更多,具體取決於用戶需要的結果的具體情況。在單個搜索文本字段(RAILS)中搜索多個關鍵字

現在,我正在使用下面顯示的一些醜陋的東西,最多可以搜索3個搜索詞。有沒有辦法使'search_length'關鍵字具有這種動態性? find方法顯然是重複性的,但我不確定如何實現自動化,並且沒有在其他地方發現任何有用的建議。

def self.search(search) 

    if search 
    search_length = search.split.length 
    find(:all, :conditions => ['name LIKE ? AND name LIKE ? AND name LIKE ?', 
    "%#{search.split[0]}%", "%#{search.split[1]}%", 
    "%#{search.split[search_length1]}%"]) 
    else 
    find(:all) 
    end 
end 

除此之外,愛好Rails迄今。

謝謝了, 利

回答

2

使用這樣的事情:

find(:all, :conditions => [(['name LIKE ?'] * search_length).join(' AND ')] + search.split.map { |name| "%#{name}" }) 

我看起來很奇怪,但是,首先生成search_length倍串的名字怎麼樣?':

['name LIKE ?'] * search_length 

那麼你有一些鍵的陣列,所以讓我們加入所有的'AND':

["name LIKE ? ", "name LIKE ? ", "name LIKE ? "].join(' AND ') 

並最終與另一個數組合並。

+0

謝謝我會玩弄。 – Lev 2011-06-13 23:10:31

+0

我想我有第一部分,我們創造了正確數量的'名字像?'連接。最後一部分仍然很腥,我必須指定符合條件的關鍵字。我應該在那裏傳遞一個數組嗎? – Lev 2011-06-13 23:53:26

+0

此代碼似乎適用於1個關鍵字,但分解更多。如果輸入兩個搜索條件,則會出現「錯誤的綁定變量數」錯誤。 – Lev 2011-06-14 00:29:24

0
formatted_columns = format_column_names(Sub.column_names) 
where(formatted_columns.map {|cn| "#{cn} like ?" }.join("or "), *(["%#{search}%"] * formatted_columns.size)) 

這需要照顧的所有列的還有場

7

如果關閉名稱變量與其他%兆頭盧卡斯斯利瓦代碼的偉大工程的正確的金額。

完整的代碼從上面爲我工作。好帖子。

def self.search(search) 

    if search 
    search_length = search.split.length 
    find(:all, :conditions => [(['name LIKE ?'] * search_length).join(' AND ')] + search.split.map { |name| "%#{name}%" }) 
    else 
    find(:all) 
    end 

end 
+0

工作完美。謝謝你,先生! – 2013-07-08 22:35:06