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
¿Fue útil?

Solución

No está seguro de cómo esto podría estar relacionado con ROR, pero de todos modos:

  1. 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.

  2. Puede item.estimated_price ser menor que cero?Si no la item.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á falsa

  3. El (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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top