Rails 5 如何动态生成多条件WHERE查询?
动态生成多条件ActiveRecord查询方案
我来帮你搞定这个动态拼接WHERE条件的问题~你现在的需求是把手动写的多次where调用变成根据keywords数组动态生成,其实核心就是利用ActiveRelation的链式调用特性,一步步叠加查询条件就好。
实现代码
def generate_query(the_query) query_template, keywords = the_query # 初始化基础查询对象 user_query = User.all # 遍历每个关键词组,逐个添加WHERE条件 keywords.each do |keyword_pair| user_query = user_query.where(query_template, *keyword_pair) end # 返回最终构建好的查询对象(执行时才会触发SQL查询) user_query end
原理说明
- ActiveRecord的
where方法不会直接执行SQL,而是返回一个新的ActiveRelation对象,所以我们可以通过链式调用不断叠加条件,就和你手动写User.where(...).where(...)的效果完全一致。 - 当
keywords = [['abc','abc'],['123','123']]时,最终生成的SQL会是:
完美匹配你手动编写的查询逻辑。SELECT "users".* FROM "users" WHERE (name LIKE 'abc' OR desc LIKE 'abc') AND (name LIKE '123' OR desc LIKE '123')
小提示
这里用占位符?传参的方式是安全的,能有效避免SQL注入问题,继续保持这个写法就好~
内容的提问来源于stack exchange,提问作者learner2017
相关产品推荐
相关产品推荐

