代码之家  ›  专栏  ›  技术社区  ›  sscirrus

Rails:将可选参数组合到查询中

  •  2
  • sscirrus  · 技术社区  · 14 年前

    用户可以通过几种不同的方式按记录筛选(如“保存”记录、“读取”记录和“标记已删除”记录),我希望他们能够 结合

    我目前的,有缺陷的,不起作用的方法。除非所有参数都已指定且有效,否则下面的代码不会生成任何内容:

    #view. Set the 'se' filter to true; leave all others as is 
    <%= link_to list_url(:id=>params[:id], :se=>"true", :st=>params[:st], :re=>params[:re]) do %> 
      <div class="button">Toggle SE</div>
    <% end %>
    
    #controller query. Add whichever params are passed into the conditions for the new page.
    #query is paginated and sorted
    @records = Record.where("user_id IN (?) AND see = ? AND star = ? AND delete = ? AND like = ?", @users.select("id"), params[:se], params[:st], params[:re]).paginate :page => params[:page], :order => (sort_column + " " + sort_direction)
    

    创建这个过滤系统的最佳方法是什么?
    我想客户端排序比每次请求服务器参与都要快-是否有一种简单的AJAX方法来完成这类事情?想象一下用户可以 任何组合。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Harish Shetty    12 年前

    试试这个:

    conditions = {:user_id => @users.select("id")}
    {
     :se => :see,
     :st => :star,
     :del => :delete
    }.each{|k1, k2| conditions[k2] = params[k1] unless params[k1].blank?}
    
    @records = Record.where(conditions).paginate(...)
    

    conditions 哈希将根据 params

    编辑1

    可以将条件散列和数组结合起来。

    @records = Record.where(conditions).where(
      ":created_at > ?",  Date.today - 30).paginate(...)
    

    conditions[:user_id] = @user.id
    

    在上面的语句中,如果RHS是一个数组,rails会自动生成 IN = )执行。

        2
  •  0
  •   Community CDub    8 年前

    也可以使用匿名作用域: Combine arrays of conditions in Rails