简体   繁体   English

Rails 搜索 sort_link 过滤结果

[英]Rails ransack sort_link on filtered results

I use Rails 5.1 and the Ransack gem.我使用 Rails 5.1 和 Ransack gem。

In my imagecapturings_controller.rb I have a before_action :get_imagecapturings to filter by month and year from a dropdown list:在我的 imagecapturings_controller.rb 我有一个 before_action :get_imagecapturings 从下拉列表中按月份和年份过滤:

  def get_imagecapturings
    @search = Imagecapturing.ransack(params[:q])
    if params.has_key?(:select)
      if params[:select][:month] == 'all'
        @imagecapturings = Imagecapturing.where("YEAR(datum_anfang) = ?", params[:select][:year])
      else
        @imagecapturings = Imagecapturing.where("MONTH(datum_anfang) = ? AND YEAR(datum_anfang) = ?", params[:select][:month], params[:select][:year])
      end
    else
      @imagecapturings = @search.result
    end
  end

And in my view my table head to make it sortable ascending/descending by columns:在我看来,我的表头可以按列升序/降序排序:

<th><%= sort_link(@search, :library) %></th>

But on the filtered results when a user clicks on the table column header the page is reloaded but the sort on the column header ascending/descending doesn't work.但是,当用户单击表格列标题时,过滤结果会重新加载页面,但对列标题升序/降序的排序不起作用。 The decoded URL looks like this:解码后的 URL 如下所示:

http://localhost:3001/?q[s]=library desc&select[month]=12&select[year]=2017&submit=Filter&utf8=✓

The sort by asc/desc works only for unfiltered results if the URL looks like this:如果 URL 如下所示,按 asc/desc 排序仅适用于未过滤的结果:

http://localhost:3001/?method=get&q[s]=library asc

My attempt to chain ransack(params[:q]) on the result list doesn't sort:我在结果列表上链接 ransack(params[:q]) 的尝试没有排序:

@imagecapturings = Imagecapturing.where("YEAR(datum_anfang) = ?", params[:select][:year])
@search = @imagecapturings.ransack(params[:q])

In Rails 3.2 and Ransack - Is it possible to pass additional params in a sort_link?Rails 3.2 和 Ransack 中 - 是否可以在 sort_link 中传递额外的参数?

a user suggests to add additional params into sort_link and I tried it with:用户建议将其他参数添加到 sort_link 中,我尝试了以下方法:

<th><%= sort_link(@search, :library, {:year => params[:select][:year], :month => params[:select][:month]}) %></th>

But it doesn't sort.但它没有排序。

How can I modify my get_imagecapturings method and/or ransack's sort_link helper in view to make it sortable on filtered results?如何修改我的 get_imagecapturings 方法和/或 ransack 的 sort_link 帮助程序,以使其可在过滤结果上排序?

If that is your exact code, your not returning the @search.result in the if params.has_key?(:select) statement.如果这是您的确切代码,则您不会在if params.has_key?(:select)语句中返回@search.result Your also not chaining your query with ransack.您也没有将您的查询与洗劫联系起来。 Try something like:尝试类似:

@search = Imagecapturing.ransack(params[:q])
query = @search.result

if params.has_key?(:select)
  if params[:select][:month] == 'all'
    @imagecapturings = query.where("YEAR(datum_anfang) = ?", params[:select][:year])
  else
    @imagecapturings = query.where("MONTH(datum_anfang) = ? AND YEAR(datum_anfang) = ?", params[:select][:month], params[:select][:year])
  end
end

I'd probably be inclined to try using some custom ransackers so you don't have to do custom view code and can stick with ransack entirely https://github.com/activerecord-hackery/ransack/wiki/using-ransackers there's some examples of converting dates like your doing.我可能倾向于尝试使用一些自定义的 ransackers,因此您不必执行自定义视图代码,并且可以完全坚持使用 ransack https://github.com/activerecord-hackery/ransack/wiki/using-ransackers有一些像您一样转换日期的示例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM