Rails 3 ActiveRecord:将多个bool“或”组合在一起

时间:2011-06-16 12:15:50

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有一个ActiveRecord对象RaceCarDriver。其中三个字段为布尔值:is_from_texasis_from_arkansasis_from_indiana。在用户搜索界面中,用户既不能选择查看所有结果,也可以选择is_from_texas仅查看来自德克萨斯州的驱动程序,或选择is_from_texasis_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条款合在一起,使得如果德克萨斯州和印第安纳州都被检查,那么司机必须来自两个州。

同样,我知道这是做作的。任何帮助表示赞赏。

2 个答案:

答案 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!