Как применить сортировку asc desc к ассоциации 3-го уровня с использованием ranksack в Ruby

#ruby-on-rails #ruby #postgresql #ransack

#ruby-on-rails #ruby #postgresql #выполнить поиск

Вопрос:

Я использую ransack gem для поиска, который работает нормально, но у меня есть поисковая система, в которой я хочу искать порядок на основе названия товара asc или desc в позициях. Он не работает и возвращается:

 ActionView::Template::Error (PG::InvalidColumnReference: ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list
LINE 1: ...wner_id" = $1 ORDER BY "orders"."created_at" ASC, lower(prod...
 

Пармас:

 Parameters: {"filter_type"=>"", 
"csfname"=>"line_items_product_title_or_order_detail_name_or_shipping_address_postal_code
_or_billing_address_postal_code_or_line_items_product_sku_or_line_items_product_yan_or_line_items_product_ean_or_id_cont", "q"=>{"s"=>"["created_at 
asc","line_items_product_title desc"]", 
"line_items_product_title_or_order_detail_name_or_shipping_address_postal_code_or_billing
_address_postal_code_or_line_items_product_sku_or_line_items_product_yan_or_line_items_pr
oduct_ean_or_id_cont"=>""}}
 

Запрос:

 @q = Order.joins(line_items: :product).where(products: {owner_id: current_seller}).ransack(params[:q])
    @seller_orders = @q.result(distinct: true)
 

SQL:

 SELECT DISTINCT "orders".* FROM "orders" INNER JOIN "line_items" ON 
"line_items"."order_id" = "orders"."id" INNER JOIN "products" ON "products"."id" = 
"line_items"."product_id" LEFT OUTER JOIN "products" "products_line_items" ON 
"products_line_items"."id" = "line_items"."product_id" WHERE "products"."owner_id" = $1 
ORDER BY "orders"."created_at" ASC, lower(products.title) DESC
 

Это работает ниже, но оно показывает заказы как 5, потому что 2 заказа содержат в них 5 позиций, и поэтому они упорядочивают их на основе этой информации.
Как мы можем применить поиск, но сделать его отдельным и т.д., чтобы заказов оставалось только 2?

 @q = Order.joins(line_items: :product).where(products: {owner_id: current_seller}).ransack(params[:q])
    @seller_orders = @q.result(distinct: true).select('orders.*, lower(products.title)')
 

Комментарии:

1. Заметки по поиску и пояснения к различиям

2. @engineersmnky спасибо. Я уже пробовал эти варианты!

3. Вы пробовали переместить select в первую строку? например Order.select('orders.*, lower(products.title)')

4. Да, я попробовал это, и запрос стал: SELECT DISTINCT orders.*, lower(products.title) FROM "orders" INNER JOIN "line_items" ON "line_items"."order_id" = "orders"."id" INNER JOIN "products" ON "products"."id" = "line_items"."product_id" LEFT OUTER JOIN "products" "products_line_items" ON "products_line_items"."id" = "line_items"."product_id" WHERE "products"."owner_id" = $1 ORDER BY lower(products.title) DESC и все еще 5 записей.

5. Да, вы действительно правы, говоря это. Конечно, клиент очень строго относится к своим каркасам и просит реализовать то же самое в бэкэнде, чтобы это произошло. Но ваш ответ дал мне доверие, чтобы объяснить это ему. Еще раз спасибо за вашу помощь 🙂