Ordenar por consulta sql mediante un parámetro url
-
11-12-2019 - |
Pregunta
Tengo este enorme feo consulta a continuación, me gustaría ordenar por ella en una vista de catálogo.Pensar algo como http://wow.dev:3000/catalog_items?&order=deals.Un millón de agradecimientos de antemano por cualquier comentario o respuestas.
select 100 - round((current_price / item.estimated_price)*100) as percent, item.cached_thumbnail_url, item.item_id, it.name,
ci.current_price, ci.close_date
from item
join catalog_item ci on ci.item_id = item.item_id
join item_translations as it on (it.item_id = item.item_id)
where (100 - round((current_price / item.estimated_price)*100)) > 49 and
item.estimated_price > 0 and ci.current_price > 0 and ci.close_date > now() and item.active = 1 and ci.active = 1 and
(current_price / estimated_price) < 1
order by (ci.close_date < DATE_ADD(now(), INTERVAL 17 hour)) and (item.estimated_price - current_price) desc
limit 12
Solución
No está seguro de cómo esto podría estar relacionado con ROR, pero de todos modos:
Usted tiene
100 - round((current_price / item.estimated_price)*100) as percent
en la cláusula SELECT, pero de todos modos el uso de la misma expresión en DONDE las condiciones.Puede
item.estimated_price
ser menor que cero?Si no laitem.estimated_price > 0
la condición es excesivo, si es cero el(100 - round((current_price / item.estimated_price)*100)) > 49
la condición será falsaEl
(current_price / estimated_price) < 1
es excesivo para las mismas razones
Para que la consulta se puede volver a escribir un poco más claramente como este:
select (100 - round((current_price / item.estimated_price)*100)) as percent,
item.cached_thumbnail_url, item.item_id, it.name,
ci.current_price, ci.close_date
from item
join catalog_item ci on ci.item_id = item.item_id
join item_translations as it on (it.item_id = item.item_id)
where
percent > 49
and ci.current_price > 0
and ci.close_date > now()
and item.active = 1
and ci.active = 1
order by
(ci.close_date < DATE_ADD(now(), INTERVAL 17 hour))
and (item.estimated_price - current_price) desc
limit 12
Esto no mejora la situación de hace un montón, pero no puedo decir más sin conocer las razones más acerca de tu DB arquitectura.
Por CIERTO el enlace en tu pregunta no trabajo (es local de enlace obviamente)
Otros consejos
Edificio en binarycode la respuesta, usted puede tratar de envolver su consulta en la ARel y, a continuación, en la acción del controlador se había pedido en el campo aprobada en la params hash, algo como esto:
class ItemsController < ApplicationController
...
def index
@items = Item.select(%{(100 - round((current_price / item.estimated_price)*100)) as percent,
item.cached_thumbnail_url, item.item_id, it.name,
ci.current_price, ci.close_date}).
joins('join catalog_item ci on ci.item_id = item.item_id').
joins('join item_translations as it on (it.item_id = item.item_id)').
where('percent > 49 and ci.current_price > 0 and ci.close_date > now() and item.active = 1 and ci.active = 1').
order(%{(ci.close_date < DATE_ADD(now(), INTERVAL 17 hour))
and (item.estimated_price - current_price) desc)}).limit(12)
@items = @items.order(params[:order]) if params[:order]
...
end
EDITAR
Como binarycode señala a continuación, puede que desee que el controlador de código más limpio mediante el movimiento de la consulta principal fuera de la acción, probablemente en un método en el Item
modelo, y asegurándose de que usted todavía devolver un Relation
objeto de ella (como la actual instrucción), por lo que podría cadena de la extra order
más tarde:
def index
@items = Item.by_price_ratio
@items = @items.order(params[:order]) if params[:order]
end