2013-04-18 49 views
3

在我的軌道控制器中,我想對我的模型進行正則表達式搜索。我的google搜索似乎表明,我將不得不寫類似:在軌道模型中進行正則表達式搜索的慣用方式?

Model.find(:all, :condition => ["field REGEXP '?' " , regex_str]) 

這是相當惡劣的,因爲這意味着MySQL的語法(我使用Postgres的)。

有沒有一種更簡潔的方式強迫鋼軌(我的情況是4)在字段上進行正則表達式搜索?

我也更喜歡使用where(),因爲它允許我將強參數(散列)直接映射到查詢。所以我想是這樣的:

Model.where(params, :match_by => { 'field': '~' }) 

這將鬆散轉化爲類似(如果PARAMS [「場」] =「regex_str」)

select * from models where field ~ regex_str 

回答

0

不幸的是,沒有習慣的方法去做這個。 ActiveRecord中沒有內置的正則表達式支持。除非每個數據庫適配器都有特定於數據庫的實現,並且並非所有數據庫都支持正則表達式匹配,否則不可能有效地進行。那些不支持相同語法的語言(例如,Postgres沒有與Ruby的Regexp類相同的regexp語法)。

您必須使用SQL來推出自己的產品,就像您在問題中提到的那樣。然而,還有其他選擇。

對於Postgres特定的解決方案,請查看pg_search,它使用Postgres的全文搜索功能。這非常快,支持模糊搜索和一些模式匹配。

elasticsearch需要更多的設置,但速度非常快,有一些不錯的寶石讓您的生活更輕鬆。這是介紹它的RailsCasts插曲。它需要運行一個單獨的服務器,但開始並不難,而且功能強大。仍然沒有正則表達式,但值得一看。

如果您只是針對單個字段進行一次性正則表達式搜索,那麼SQL可能是最佳選擇。