Pergunta

Eu tenho esse enorme e feia consulta abaixo, eu gostaria de classificar por ele em um modo de exibição de catálogo.Pensando em algo como http://wow.dev:3000/catalog_items?&order=deals.Um milhão de agradecimentos antecipadamente por quaisquer comentários ou respostas.

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
Foi útil?

Solução

Não sei como isso poderia estar relacionado ao ROR, mas de qualquer maneira:

  1. Você tem 100 - round((current_price / item.estimated_price)*100) as percent na sua cláusula SELECT, mas de qualquer maneira, usando a mesma expressão em que as condições.

  2. Pode item.estimated_price ser menor que zero?Se não o item.estimated_price > 0 a condição é excessiva, se é zero o (100 - round((current_price / item.estimated_price)*100)) > 49 a condição será falsa

  3. O (current_price / estimated_price) < 1 é excessivo para as mesmas razões

Então, você consulta pode ser reescrito um pouco mais 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

Isso não melhorar a situação de um monte, mas eu não posso dizer mais sem saber mais razões sobre seu banco de dados arquitetura.

BTW o link na sua pergunta, não funciona (é você ligação local, obviamente)

Outras dicas

Construção em cima binarycode da resposta, você pode tentar embrulhar a sua consulta no ARel e, em seguida, na ação de um controller que você gostaria de ordem no campo transmitido o hash params, algo como isto:

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 pontos abaixo, você pode querer fazer o controlador de código de limpeza movendo a consulta principal fora da ação, provavelmente em um método no Item modelo, e certificando-se de que você ainda retornar um Relation objeto dela (como a atual declaração), de modo que você pudesse cadeia extra order mais tarde:

def index
  @items = Item.by_price_ratio
  @items = @items.order(params[:order]) if params[:order]
end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top