2013-01-20 21 views
0

我建立起来的步骤的活动记录关联对象,允许用户通过品牌和型号的汽车进行过滤的汽车零部件列表的创建:红宝石:干出来的活动记录关联对象

parts = Part.where(:listed => (start_date..end_date)) 

unless filters[:make_id].nil? || filters[:make_id] == 0  
    parts = parts.joins(:car). 
     where("cars.make_id = ?", filters[:make_id]) 
end 

unless filters[:model_id].nil? || filters[:model_id] == 0  
    parts = parts.joins(:car). 
     where("cars.model_id = ?", filters[:model_id]) 
end 

etc... 

这是重复性的,并且我想把这个抽象成一个将'make_id'和'model_id'作为参数的方法。保留的一个重要特征是,如果过滤器为零(例如,用户不指定模型),则返回所有模型的零件。

我无法弄清楚如何解决这个问题,我不确定谷歌应该怎么做。你能帮我吗?

回答

1
parts = Part.where(:listed => (start_date..end_date)) 

[:make_id, :model_id].each do |k| 
    filters[k] 
    .tap{|f| parts = parts.joins(:car).where("cars.#{k} = ?", f) unless f.to_i.zero?} 
end 
+0

谢谢sawa。你知道这叫做什么吗?即我应该搜索什么? –

+0

@DerekHill你提到哪个部分? – sawa

+0

再想一想就不用担心了。我想这是遍历一系列符号并将它们转换为需要的字符串的想法。还有我以前没有遇到的轻拍的使用。只需要让我的头在附近。非常感谢您的帮助。 –