3

在我的 Rails 控制器中,我想对我的模型进行正则表达式搜索。我的谷歌搜索似乎表明我必须写如下内容:

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

这是相当讨厌的,因为它暗示了 MySQL 语法(我正在使用 Postgres)。

有没有一种更简洁的方法来强制 rails(在我的情况下为 4 个)在字段上进行正则表达式搜索?

我也更喜欢使用 using where(),因为它允许我将我的强参数(哈希)直接映射到查询。所以我想要的是:

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

这将松散地转换为类似 (if params['field'] = 'regex_str')

select * from models where field ~ regex_str
4

1 回答 1

0

不幸的是,没有惯用的方法来做到这一点。ActiveRecord 中没有对正则表达式的内置支持。除非每个数据库适配器都有特定于数据库的实现,并且并非所有数据库都支持正则表达式匹配,否则不可能高效地完成。那些不支持相同的语法(例如,Postgres 没有与 Ruby 的Regexp类相同的正则表达式语法)。

正如您在问题中所指出的,您必须使用 SQL 自行开发。然而,还有其他选择。

对于 Postgres 特定的解决方案,请查看pg_search,它使用 Postgres 的全文搜索功能。这非常快并且支持模糊搜索和一些模式匹配。

elasticsearch需要更多设置,但速度非常快,有一些不错的宝石可以让您的生活更轻松。这是RailsCasts的一集介绍它。它需要运行单独的服务器,但上手并不难,而且功能强大。仍然没有正则表达式,但值得一看。

如果您只是对单个字段进行一次性正则表达式搜索,那么 SQL 可能是您的最佳选择。

于 2013-04-19T03:11:23.887 回答