【问题标题】:Find by conditions with * wildcards使用 * 通配符按条件查找
【发布时间】:2012-01-24 11:56:11
【问题描述】:

我有一个带有两个参数的搜索表单。如果参数为空,我想全部搜索。

var_1 = params[:var_1].blank? ? "*" : params[:var_1]
var_2 = params[:var_2].blank? ? "*" : params[:var_2]

@mymodels = MyModel.find(:all,:conditions=>["var_1 = ? and var_2 = ?",var_1,var_2])

这是我得到的:

SELECT ... WHERE (var_1 = '*' and ...

我需要的是:

SELECT ... WHERE (var_1 = * and ...

有什么建议吗?

【问题讨论】:

    标签: sql ruby-on-rails ruby activerecord find


    【解决方案1】:

    我会有条件地建立标准列表。即仅当相应参数不为空时才在查询中包含一个字段:

    conditions = []
    values = []
    [:var1, :var2].each do |field|
      unless params[field].blank?
        conditions << "#{field} = ?"
        values << params[:field]
      end
    end
    

    然后运行find:

    MyModel.find(:all, :conditions => [conditions.join(" AND "), values])
    

    【讨论】:

      【解决方案2】:

      我会考虑建立一个可修改的查询,因为 arel 就是建立在这个想法之上的。

      例如,

      query = Model.scoped
      query = query.where(:var1 => params[:var1]) if params[:var1].present?
      query = query.where(:var2 => params[:var2]) if params[:var2].present?
      ... more conditions
      @models = query.all # returns the array, finally
      

      我在这里使用了 Model::scoped 来继续我的搜索,因为它 返回一个 ActiveRecord::Relation 对象,而不是像 Model.all 这样的数组 会的。

      我发现开始广泛搜索然后缩小搜索范围很有帮助。

      希望对你有帮助,

      -卢克

      【讨论】:

        【解决方案3】:

        我想SELECT ... WHERE (var_1 = * and ... 无论如何都行不通,因为你需要一个like 子句,

        例如:SELECT ... WHERE var_1 like '%' and ...

        所以一个选项应该是,有一个单独的方法:

        例如:

        def mymodel_list(var1, var2)
          @mymodels = nil
          if var1 && var2
            @mymodels = MyModel.find(:all,:conditions=>["var_1 = ? and var_2 = ?",var_1,var_2])
          else
            @mymodels = MyModel.find(:all) 
          end  
          @mymodels
        end
        

        IMO,有时最好多写一些代码,这样逻辑就可以轻松管理。

        【讨论】:

          猜你喜欢
          • 2020-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-19
          • 1970-01-01
          相关资源
          最近更新 更多