Ruby:干掉Active Record Relation对象的创建

时间:2013-01-20 18:07:38

标签: ruby-on-rails ruby

我正在逐步建立一个Active Record Relation对象,允许用户按汽车的品牌和型号过滤汽车零件清单:

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 个答案:

答案 0 :(得分: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