完全停留在使用关联的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'
答案 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 %>