假设我有一个名为books
的表,表中有一个名为keyword
的列,还有一个名为words
的字符串。
我想从books
中选择所有记录,其中keyword
列包含在words
中。我可以直接在mysql中使用LIKE来完成这一操作。如果有人能给予我语法的话,我正在尝试将其转换为一个针对rails应用的ActiveRecord查询。
棘手的是,我希望查找列值包含在字符串中的记录,而不是相反。与此问题非常相似,只是需要将其转换为ActiveRecord.SQL - Query to find if a string contains part of the value in Column
下面是我正在尝试翻译的一个有效的sql查询。SELECT * FROM books WHERE "new science fiction" LIKE CONCAT('%',keyword,'%');
在上面的例子中,“new science fiction”是字符串words
。
假设我有3个book
记录。book1有关键字“science”,book2有关键字“fiction”,book3有关键字“other”。我上面的查询将返回记录book1和book2。因为“science”和“fiction”包含在words
字符串“new science fiction”中。
我的SQL查询可以工作,但我不知道如何在ActiveRecord中使用Book.where
语句。
1条答案
按热度按时间9w11ddsr1#
我觉得你最好的选择是:
这将导致
这将返回相同的记录。
注意:
IN()
可能区分大小写,具体取决于您的RDBMS。要避免这种情况,我们可以将上面的内容更改为这将导致
如果你真的想去与你现在有它的方式,我们可以一起破解如下:
这将产生所需的SQL,同时仍然利用Arel和连接适配器提供的转义。
这里区分大小写不是问题,因为
Arel::Predications#matches
默认使用case_sensitive = false
,这意味着Postgres将使用ILIKE
而不是LIKE