Rails .where()子句中不区分大小写的匹配

Lui*_*igi 2 ruby ruby-on-rails

我有以下代码:

Test.all.where("comment like '%test%'")
Run Code Online (Sandbox Code Playgroud)

我怎么能写这个包括所有模型的地方Test.comment is like '%test%',但忽略了这个例子test.Test,Testing并且TEST都应归还.

Fir*_*DoL 6

如果您不关心更改数据库(顺便说一下它应该是有效的sql),您可以这样做:

Comment.where("LOWER(comments.comment) LIKE LOWER('%test%')")
Run Code Online (Sandbox Code Playgroud)

如果你关心数据库的可移植性,我建议你这个(仅限arel):

comments = Comment.arel_table
Comment.where(comments[:comment].matches("%test%"))
Run Code Online (Sandbox Code Playgroud)

考虑到第二个将忽略案例直到版本XXX但我不记得哪个版本.如果您使用的是Rails 3.2.x或Rails 4,那么就可以了(在两者中都进行了测试).

SQL输出示例
使用以前的arel代码,PostgreSQL中的输出如下:

SELECT comments.* FROM comments WHERE (comments.comment ILIKE '%test%')
Run Code Online (Sandbox Code Playgroud)