我使用Ransack,Kaminari和Postgres在我的Rails控制器中执行查询/分页,我有以下代码:
ransack = current_user.condition? ? @company.contacts.ransack(params[:q]) :
current_user.contacts.ransack(params[:q])
ransack.sorts = 'id desc' if ransack.sorts.empty?
contacts = ransack.result.includes(:table1, :table2)
contacts = contacts.page(params[:page]).per(params[:per])
render json: contacts,
meta: pagination(contacts, total_count: true)
分页方法定义如下:
def pagination(kaminari, total_count: false)
return unless kaminari.respond_to?(:current_page)
pagination = {
current_page: kaminari.current_page,
next_page: kaminari.next_page,
prev_page: kaminari.prev_page
}
pagination[:total_count] = kaminari.total_count if total_count
pagination
end
使用此代码,一切都按预期工作。但是,如果我将排序行更改为:
ransack.sorts = 'created_at desc' if ransack.sorts.empty?
然后我开始在结果中收到重复和不需要的条目。谁能告诉我为什么会这样呢?
答案 0 :(得分:1)
您的搜索结果中有一些includes
,并且每个表格都可能包含created_at
字段,因此您的排序可能不明确。
在运行此查询时,您应该在控制台中查看生成SQL的内容,但您可能会发现更改自己的排序'行到:
ransack.sorts = 'contacts.created_at desc' if ransack.sorts.empty?
(或任何表名适合您)
...有助于消除排序歧义。