跨多个表的ActiveRecord条件。

跨多个表的ActiveRecord条件。,activerecord,join,conditional-statements,Activerecord,Join,Conditional Statements,我试图从我的数据库中检索汽车,每辆汽车都有一个制造商,可以有多种款式 例如,福特嘉年华是一辆双门轿车、轿车和哈奇 我已经在模型中设置了关系,但现在我想创建一个查询来返回结果。查询构造将取决于所提供的参数 这就是我到目前为止得到的 conditions = {} conditions[:manufacturer_id] = params[:manufacturer_id] unless params[:manufacturer_id].blank? # this works! conditions

我试图从我的数据库中检索汽车,每辆汽车都有一个制造商,可以有多种款式

例如,福特嘉年华是一辆双门轿车、轿车和哈奇

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

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

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 条件={} 条件[:manufacturer_id]=参数[:manufacturer_id],除非参数[:manufacturer_id]。空白?#这管用! 条件[:style_id]=“style_id IN(?)、参数[:style_id],除非参数[:style_id]。为空#这打破了它:( cars=Car.find(:all,:conditions=>conditions) 返回render:json=>cars 返回的错误为
PG::Error:Error:column cars.style\u id不存在
当然这是因为style\u id位于名为
cars\u styles
的联接表中。是否有方法告诉ActiveRecord在条件中查找哪个表


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

我最终使用这样的范围查询来完成此操作

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 范围:来自制造商,lambda{{124; manu}{:joins=>:manufacturer,:conditions=>“manufacturers.id={manu}” 作用域:from|style,lambda{style}{:joins=>:style,:conditions=>“style.id={style}}” 定义自我获取车辆(参数) 范围=自我 [:制造商,:样式]。每个都有| scope=scope.send(“from#{s}”,params[s]),如果params[s].存在? 结束 范围 结束 很好