在我的rails控制器中,我想对我的模型进行正则表达式搜索。我的谷歌搜索似乎表明我必须写一些像:
Model.find( :all, :condition => ["field REGEXP '?' " , regex_str] )
这是相当讨厌的,因为它意味着MySQL语法(我正在使用Postgres)。
是否有更简洁的方法来强制使用rails(在我的情况下为4)在字段上进行正则表达式搜索?
我也更喜欢使用where()
,因为它允许我将我的强参数(哈希)直接映射到查询。所以我想要的是:
Model.where( params, :match_by => { 'field': '~' } )
会松散地转化为类似的东西(如果params ['field'] ='regex_str')
select * from models where field ~ regex_str
答案 0 :(得分:0)
不幸的是,没有惯用的方法来做到这一点。 ActiveRecord中没有对正则表达式的内置支持。除非每个数据库适配器都具有特定于数据库的实现,并且并非所有数据库都支持正则表达式匹配,否则不可能有效地执行。那些并不都支持相同语法的东西(例如,Postgres没有与Ruby的Regexp
类相同的regexp语法)。
正如您在问题中所指出的那样,您必须使用SQL滚动自己。但是,有其他选择。
对于Postgres特定的解决方案,请查看pg_search,它使用Postgres的全文搜索功能。这非常快,支持模糊搜索和一些模式匹配。
elasticsearch需要更多设置,但速度非常快,有一些不错的宝石可以让您的生活更轻松。这是介绍它的RailsCasts一集。它需要运行一个单独的服务器,但它并不难开始,而且功能强大。仍然没有正则表达式,但值得一看。
如果您只是针对单个字段进行一次性正则表达式搜索,那么SQL可能就是您的选择。