【问题标题】:Rails ransack sort_link on filtered resultsRails ransack sort_link 过滤结果
【发布时间】:2018-02-19 09:20:44
【问题描述】:

我使用 Rails 5.1 和 Ransack gem。

在我的 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

在我看来,我的表头可以按列升序/降序排序:

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

但是在用户点击表格列标题时的过滤结果中,页面会重新加载,但列标题升序/降序的排序不起作用。 解码后的 URL 如下所示:

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

如果 URL 如下所示,则按 asc/desc 排序仅适用于未过滤的结果:

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

我尝试在结果列表上链接 ransack(params[:q]) 没有排序:

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

Rails 3.2 and Ransack - Is it possible to pass additional params in a sort_link?

一位用户建议在 sort_link 中添加额外的参数,我尝试了:

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

但它没有排序。

如何修改我的 get_imagecapturings 方法和/或 ransack 的 sort_link 帮助程序,以使其可根据过滤结果排序?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    如果那是您的确切代码,那么您不会在 if params.has_key?(:select) 语句中返回 @search.result。您也没有将您的查询与洗劫联系起来。尝试类似:

    @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
    

    我可能倾向于尝试使用一些自定义 ransacker,这样您就不必编写自定义视图代码,并且可以完全坚持使用 ransack https://github.com/activerecord-hackery/ransack/wiki/using-ransackers 有一些像您一样转换日期的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多