2011-10-25 41 views
1

我需要在Rails應用程序中實現一些搜索功能。我發現的大部分內容通常針對簡單的純文本搜索。我正試圖實現更具體的東西。排序的功能,我希望創造是這樣(從C應用):Rails 3中的複雜搜索屏幕

http://andyc.ac/query.gif

形式只是提交用戶輸入的數據。因此,我需要將諸如「3..7」之類的字符串轉換爲where方法的SQL條件,例如,

TestLine.where("test_int >= ? and test_int <= ?", MinInt, MaxInt) 

看起來好像這是已經存在的地方。預期的確切格式並不太重要,因爲用戶不在Rails和C應用程序之間共享。這將如何完成?

+0

爲什麼不在您的模型中使用範圍? –

+0

包括圖中的真棒問題。 +1 – sscirrus

回答

1

FWIW您所描述的特定功能實際上是直接支持的。好吧......差不多。從the docs

範圍可以在散列被用於使用SQL BETWEEN操作者:

Student.where(:grade => 9..12) 

當然那麼它的用戶的字符串輸入翻譯到一個範圍,的問題,其是不是很複雜,例如:

def str_to_range str 
    str =~ /(\d+)\.\.(\d+)/ 

    Range.new *$~.captures.map(&:to_i) 
end 

這很可能會令在scope最有意義的模型。 (當然,一個簡單的方法是簡單地將eval '9..12',但是eval從最終用戶的輸入是一個非常非常糟糕的主意。)

+0

謝謝我正在研究這個問題:我有點猶豫要從C應用程序中重寫查詢庫中的數千行代碼,但是當我嘗試它時,看起來像我需要的位適合幾頁的代碼! – asc99c

+0

這看起來像我要去的方法。我發現SQLite不喜歡字符串字段上的BETWEEN子句(儘管我們有很多字符串,但主要是數字),所以我要切換數據庫來解決這個問題。 – asc99c

+0

要小心這樣做,因爲字符串比較和數字比較的行爲往往不同。所以儘管'5'可能是'1和10之間','5'可能會或可能不會'1'和'10'之間(考慮數學與字母)。解決方法是將您的字符串轉換爲數字,例如'CAST(str_val AS INT)和CAST(other_str_val AS INT)'之間。這可能會爲您節省切換數據庫平臺的麻煩。 –

1

看看思維獅身人面像(http://freelancing-god.github.com/ts/en/)。它可能會讓你的任務變得更容易。您可以在此搜索: http://freelancing-god.github.com/ts/en/searching.html#basic

+0

謝謝,我目前正在研究這個。它看起來不錯,但我不確定它是否真正優化,以允許搜索每個模型的每個領域。 – asc99c