ruby-on-rails – 有条件地链接范围的最佳方式
发布时间:2020-12-16 21:25:39 所属栏目:百科 来源:网络整理
导读:我正在尝试扩展我的服务器端数据表的功能.我将一些额外的过滤器传递给我的控制器/数据表,我用它来过滤结果.目前在我的模型中,我正在测试在应用我的示波器之前是否存在参数,但我不相信这是最好的方法,因为当我的过滤器列表增长时,我会有很多if / else场景.我
我正在尝试扩展我的服务器端数据表的功能.我将一些额外的过滤器传递给我的控制器/数据表,我用它来过滤结果.目前在我的模型中,我正在测试在应用我的示波器之前是否存在参数,但我不相信这是最好的方法,因为当我的过滤器列表增长时,我会有很多if / else场景.我怎么能这样做’轨道’?
if params[:store_id].present? && params[:status].present? Order.store(params[:store_id]).status(params[:status]) elsif params[:store_id].present? && !params[:status].present? Order.store(params[:store_id]) elsif !params[:store_id].present? && params[:status].present? Order.status(params[:status]) else Order.joins(:store).all end 回答: query = Order.all query = query.store(params[:store_id]) if params[:store_id].present? query = query.status(params[:status]) if params[:status].present? query.includes(:store) 解决方法
由于关系是可链接的,因此“构建”搜索查询通常很有帮助.这样做的确切模式差异很大,我提醒不要过度设计任何东西,但是在我工作的大多数大型Rails代码库中,使用普通的Ruby对象(PO??RO)来构建查询是很常见的.在你的情况下,你可能只是简单地简化你的逻辑:
relation = Order.join(:store) if params[:store_id] relation = relation.store(params[:store_id]) end if params[:status] relation = relation.status(params[:status]) end @orders = relation.all Rails甚至提供ways to “undo” logic that has been chained previously,以防您的需求变得特别复杂. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |