我有一个ActiveRecord对象RaceCarDriver
。其中三个字段为布尔值:is_from_texas
,is_from_arkansas
和is_from_indiana
。在用户搜索界面中,用户既不能选择查看所有结果,也可以选择is_from_texas
仅查看来自德克萨斯州的驱动程序,或选择is_from_texas
和is_from_indiana
查看其中一个的所有驱动程序的状态。
现在,我知道这个例子有点做作,但我想避免实际应用程序的复杂性。
我最好的尝试是:
@drivers = RaceCarDriver.select('name').
where(params[:check_texas] == 0 || :is_from_texas => params[:check_texas]).
where(params[:check_arkansas] == 0 || :is_from_arkansas => params[:check_arkansas]).
where(params[:check_indiana] == 0 || :is_from_indiana => params[:check_indiana])
然而,这个ANDS
链式where
条款合在一起,使得如果德克萨斯州和印第安纳州都被检查,那么司机必须来自两个州。
同样,我知道这是做作的。任何帮助表示赞赏。
答案 0 :(得分:1)
RaceCarDriver.select('name').
where("is_from_texas = ? OR is_from_arkansas = ? OR is_from_indiana = ?",params[:is_from_texas],params[:is_from_arkansas],params[:is_from_indiana])
答案 1 :(得分:0)
@drivers = RaceCarDriver.select('name')
@drivers = @drivers.where(:is_from_texas => params[:check_texas]) if params[:check_texas]
@drivers = @drivers.where(:is_from_arkansas => params[:check_arkansas]) if params[:check_arkansas]
@drivers = @drivers.where(:is_from_indiana => params[:check_indiana]) if params[:check_indiana]
修改强>
解决方案1:
where_options = { :is_from_texas => params[:check_texas],
:is_from_arkansas => params[:check_arkansas],
:is_from_indiana => params[:check_indiana] }.select{|k,v| v.present? }
where_conditions = where_options.map{|k,v| "#{k} = #{v}"}.join(" OR ")
@drivers = RaceCarDriver.select('name').where(where_conditions)
解决方案2:
@scoped_drivers = RaceCarDriver.select('name')
@drivers = []
@drivers << @scoped_drivers.where(:is_from_texas => params[:check_texas]) if params[:check_texas]
@drivers << @scoped_drivers.where(:is_from_arkansas => params[:check_arkansas]) if params[:check_arkansas]
@drivers << @scoped_drivers.where(:is_from_indiana => params[:check_indiana]) if params[:check_indiana]
@drivers.flatten!