用户在搜索栏上选择的顺序如何? 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
希望对您有所帮助!上面的代码可能有拼写错误,但总的来说应该可以完成您想要做的事情。如果其中的任何部分需要更多解释,请告诉我。
我正在创建一个客户目录,其中包含一个搜索栏和一个下拉菜单,可以选择 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
希望对您有所帮助!上面的代码可能有拼写错误,但总的来说应该可以完成您想要做的事情。如果其中的任何部分需要更多解释,请告诉我。