2012-12-17 89 views
0

我创建了一张放置产品手册的表格。我希望允许用户根据三个下拉菜单(产品类型,运营商,概念)搜索表格。我创建了菜单,并且控制器正确地传递参数。如果用户按全部3个条件进行搜索,则搜索将正确显示。如果用户只选择一个或两个搜索选项,结果总是一无所获。我明白为什么会发生这种情况(模型试图通过所有三个标准进行搜索,当缺少时,它只是在该字段中搜索nil),但我确定是正确的解决方案。请帮忙!我的模特如下...谢谢如何在不需要所述标准的情况下基于多个搜索条件搜索表格?

def self.search (search_product_type, search_carrier, search_concept) 

    if search_product_type.blank? && search_carrier.blank? && search_concept.blank? 
    scoped 
    else 
    Ad.where(carrier_id: search_carrier) 
     .where(product_type_id: search_product_type) 
     .where(concept: search_concept) 
    end 
end 
+1

你应该真的考虑寻找一个宝石来帮助你描述你所描述的。一个**的**是Ernie的** [Ransack](https://github.com/ernie/ransack)**。甚至还有** [demo](http://ransack-demo.herokuapp.com/)**你可以试试。 – deefour

+0

谢谢..我会试图实现这个宝石,并发布更新 –

回答

1

作为@Deefour在评论中说你应该使用一颗宝石。但是,你也可以这样做:

def self.search (search_product_type, search_carrier, search_concept) 

    if search_product_type.blank? && search_carrier.blank? && search_concept.blank? 
    scoped 
    else 
    tmp = {} 

    if search_carrier.present? 
     tmp[:carrier_id] = search_carrier 
    end 

    if search_product_type.present? 
     tmp[:product_type_id] = search_product_type 
    end 

    if search_carrier.present? 
     tmp[:concept] = search_concept 
    end 

    Ad.where(tmp) 
    end 
end 
+1

它很少得到很多的爱,但我喜欢在ARel做这种事情,如果我要手动做,灵活性更大*(也就是说,您可以混合使用OR和AND条件**和**,如果需要,**可以将返回值作为ARel表达式传递,以便稍后进一步处理)*。这样一个例子是http://stackoverflow.com/a/13685504/605707 – deefour

+0

很酷,我没有尝试ARel那样,我会做一些测试......感谢这个主意! – pablomarti

+0

谢谢@ pablo89。不幸的是,这并没有达到预期的结果。它只显示第一个搜索条件的正确结果。其他没有显示 –