如何在Rails的ActiveRecord中实现列值被指定字符串包含的查询?
Rails ActiveRecord实现列值包含于指定字符串的查询
核心解决方案
直接用参数化的where语句即可对应你提供的SQL逻辑:
words = "new science fiction" Book.where("? LIKE CONCAT('%', keyword, '%')", words)
关键说明
?是ActiveRecord的安全参数占位符,会自动将words变量的值注入查询,完全避免SQL注入风险。CONCAT('%', keyword, '%')会给keyword列的值前后拼接通配符%,实现「检查keyword是否是words子串」的逻辑,正好匹配你要的「列值被包含在指定字符串中」的查询需求。
替代写法(Arel面向对象方式,Rails 5+)
如果偏好纯面向对象的查询构建方式,可以用Arel实现:
words = "new science fiction" keyword_column = Book.arel_table[:keyword] Book.where(Arel::Nodes::InfixOperation.new('LIKE', Arel::Nodes.build_quoted(words), "%#{keyword_column}%"))
不过第一种字符串参数化写法已经足够简洁安全,日常开发中更常用。
效果验证
以你的示例场景测试:
当words = "new science fiction"时,keyword为'science'、'fiction'的Book记录会被匹配返回,'other'则不会,和你提供的原生SQL执行结果完全一致。
内容的提问来源于stack exchange,提问作者dthegnome
相关产品推荐
相关产品推荐

