#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. Да, вы действительно правы, говоря это. Конечно, клиент очень строго относится к своим каркасам и просит реализовать то же самое в бэкэнде, чтобы это произошло. Но ваш ответ дал мне доверие, чтобы объяснить это ему. Еще раз спасибо за вашу помощь 🙂