Ransack - 在show动作中对关联进行排序

时间:2017-01-22 19:47:01

标签: ruby-on-rails sorting ransack

完全停留在使用关联的Ransack排序。想要对来自不同品牌的产品列表进行排序。

品牌型号:

class Brand < ApplicationRecord
    has_many :products
end

品牌控制器:

def show
    @brand = Brand.find(params[:id])
    @q = @brand.products.ransack(params[:q])
end

品牌视图:

<%= search_form_for @q, url: products_path(params[:id]) do |f| %>
      <%= f.search_field :brand_products_title_cont %>
      <%= sort_link(@q, :brand_products_id)%>
      <%= sort_link @q, :brand_products_title %>
<% end %>

我可以毫无问题地过滤product.title,但排序不起作用。思考的错误是什么?

点击按标题排序后的SQL输出:

  Brand Load (0.3ms)  SELECT  `brands`.* FROM `brands` WHERE `brands`.`id` = 2 LIMIT 1

  CACHE (0.0ms)  SELECT  `brands`.* FROM `brands` WHERE `brands`.`id` = 2 LIMIT 1  [["id", 2], ["LIMIT", 1]]

  Rendering brands/show.html.erb within layouts/application
  Product Load (19.5ms)  SELECT `products`.* FROM `products` WHERE `products`.`brand_id` = ‚BRANDNAME'

3 个答案:

答案 0 :(得分:1)

我通过以下方式解决了这个问题:

class Job < ApplicationRecord
 has_one :address
end

地址看起来像

{ street, city, state, zipcode }

我想对job.address.street

进行排序

在我的控制器中我有:

@q = Job.ransack(params[:query])
@q.sorts = params.dig(:q, :s) || 'id asc'

在我看来,我有:

<%= sort_link(@q, :address_street) %>

答案 1 :(得分:0)

Ransack README有关于关联排序的说法:

  

如果您无法对关联进行排序,请尝试使用SQL字符串   使用复数表('departments.title''employees.last_name')   而不是符号化的关联(:department_title),   :employees_last_name)。

在您的情况下,这将是这样的:

sort_link @q, 'products.title'

答案 2 :(得分:0)

您对 @ brand.products 使用搜索而非 @brand

在这种情况下,你可以在视图中尝试这样的事情:

<%= search_form_for @q, url: brand_path(params[:id]) do |f| %>
    # Search if the name field contains...
    <%= f.search_field :title_cont %>
    <%= sort_link(@q, :id)%>
    <%= sort_link @q, :title %>
<% end %>