多个表中的ActiveRecord条件。

时间:2012-12-11 06:16:15

标签: activerecord join conditional-statements

我正在尝试从我的数据库中检索汽车,其中每辆汽车都有制造商,并且可以有多种样式。

例如,福特嘉年华是轿跑车,轿车和舱门。

我已经在我的模型中设置了我的关系,但现在我想创建一个查询来返回结果。查询结构将取决于提供的参数。

这是我到目前为止所得到的

conditions = {}
conditions[:manufacturer_id] = params[:manufacturer_id] unless params[:manufacturer_id].blank? # this works!
conditions[:style_id] = "style_id IN (?)", params[:style_ids] unless params[:style_ids].blank? #this breaks it :(

cars = Car.find(:all, :conditions=> conditions)
return render :json => cars

返回的错误是 PG::Error: ERROR: column cars.style_ids does not exit当然这是因为style_id位于名为cars_styles的连接表中。有没有办法告诉ActiveRecord在条件中寻找哪个表?

这里的关键是我想只有一个控制器方法,它接受存在的params,然后创建正确的查询。因此,如果我没有manufacturer_id,它只会查询样式,反之亦然。当然,我稍后也会添加其他参数。

1 个答案:

答案 0 :(得分:0)

我最终使用像这样的范围查询来做这个

scope :from_manufacturer, lambda{|manu|{:joins => :manufacturer, :conditions => "manufacturers.id = #{manu}" }}
    scope :from_style, lambda{|style|{:joins => :style, :conditions => "styles.id = #{style}"}}
    def self.get_cars(params)
        scope = self 
        [:manufacturer,:style].each do |s|

            scope = scope.send("from_#{s}", params[s]) if params[s].present?

         end
        scope
    end

效果很好!