我正在尝试从我的数据库中检索汽车,其中每辆汽车都有制造商,并且可以有多种样式。
例如,福特嘉年华是轿跑车,轿车和舱门。
我已经在我的模型中设置了我的关系,但现在我想创建一个查询来返回结果。查询结构将取决于提供的参数。
这是我到目前为止所得到的
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,它只会查询样式,反之亦然。当然,我稍后也会添加其他参数。
答案 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
效果很好!