用户在搜索栏上选择的顺序如何? Rails

How order by selected by the users on search bar? Rails

我正在创建一个客户目录,其中包含一个搜索栏和一个下拉菜单,可以选择 select 您希望如何对结果进行排序。代码如下:

customers_controller.rb

  def index
    if params[:search]
      @customers = Customer.search(params[:search]).order("id DESC")
    else
      @customers = Customer.order("id DESC").all
    end
  end

customer.rb

      def self.search(query)
        where("name like ?", "%#{query}%")
        where("email like ?", "%#{query}%")
        where("username like ?", "%#{query}%") 
      end

查看

<div class="row">
  <div class="col-lg-8">

    <%= form_tag(customers_path, :method => "get", id: "customer-search-form", role: "search") do %>

      <div class="input-group">
        <span class="input-group-btn">

          <%= button_tag(type: 'submit', class: "btn btn-default") do %>
            Buscar
          <% end %>

        </span>

        <%= text_field_tag :search, params[:search], class: "form-control" %>

      </div><!-- /input-group -->

    <% end %>

  </div><!-- /.col-lg-8 -->

  <div class="col-lg-4">
    <select class="form-control">
      <option>Ordenar por...</option>
      <option>Mas antiguo</option>
      <option>Mas reciente</option>
      <option>Nombre A-Z</option>
      <option>Nombre Z-A</option>
      <option>Correo A-Z</option>
      <option>Correo Z-A</option>
      <option>Usuario A-Z</option>
      <option>Usuario Z-A</option>
    </select>
  </div>
</div>

我不知道如何排序结果。

谢谢

首先,您的 .query 方法有一个错误 -- 作用域只是重复,没有以任何方式连接,所以它总是只过滤最后一个。您可以通过将条件与 OR 组合来修复它,如下所示:

def self.search(query)
  where(["name LIKE ? OR email LIKE ? OR username LIKE ?", query, query, query])
end

现在,为了订购,您首先需要在表单中移动 select 语句,并为其命名,以便它填充到您的 params 哈希中。您可以为此使用 Rails 表单助手,或者直接使用它:

<select class="form-control" name="ordering">

其次,我会给每个选项一个唯一的值...可能是一个数字索引,这样您就可以引用数组中的元素:

<option value="0">Ordenar por...</option>
<option value="1">Mas antiguo</option>
<option value="2">Mas reciente</option>

我们快到了!最后也是最棘手的一步是让 ordering 参数变得重要。将一个常量放入您的控制器中,其中每个索引与上面的标签值对齐(请记住第一个元素是 0,我将其作为您的默认排序):

ORDERS = [ "id DESC", "id ASC", "id DESC", "name ASC", "name DESC" ] # etc.

然后,在您的 index 操作中调用 .order 时使用它(我也将您的查询重构为更干):

def index
  scope = Customer

  if params[:search]
    scope = scope.search(params[:search])
  end

  if params[:ordering] && ordering = ORDERS[params[:ordering].to_i]
    scope = scope.order(ordering)
  end

  @customers = scope.all
end

希望对您有所帮助!上面的代码可能有拼写错误,但总的来说应该可以完成您想要做的事情。如果其中的任何部分需要更多解释,请告诉我。