Сортировка по SQL-запросу с использованием параметра URL

StackOverflow https://stackoverflow.com//questions/11663027

Вопрос

Ниже у меня есть огромный уродливый запрос, я бы хотел отсортировать его в представлении каталога.Думая что-то вроде http://wow.dev:3000/catalog_items?&order=deals.Заранее миллион благодарностей за любые комментарии и ответы.

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
Это было полезно?

Решение

Не знаю, как это может быть связано с ROR, но все равно:

  1. У вас есть 100 - round((current_price / item.estimated_price)*100) as percent в предложении SELECT, но в любом случае используется одно и то же выражение в условиях WHERE.

  2. Может item.estimated_price быть меньше нуля?Если не item.estimated_price > 0 условие является избыточным, если оно равно нулю, (100 - round((current_price / item.estimated_price)*100)) > 49 условие будет ложным

  3. А (current_price / estimated_price) < 1 является чрезмерным по тем же причинам

Таким образом, ваш запрос можно переписать более четко следующим образом:

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

Это не сильно улучшает ситуацию, но я не могу сказать больше, не зная больше причин, касающихся вашей архитектуры БД.

Кстати, ссылка в вашем вопросе не работает (очевидно, это ваша местная ссылка)

Другие советы

Основываясь на ответе двоичного кода, вы можете попробовать обернуть свой запрос в ARel, а затем в действии контроллера вы упорядочите поле, переданное в хэше параметров, примерно так:

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

РЕДАКТИРОВАТЬ

Как указано ниже в двоичном коде, вы можете захотеть очистить код контроллера, переместив основной запрос за пределы действия, возможно, в метод в Item модель и убедиться, что вы по-прежнему возвращаете Relation объект из него (как это делает текущий оператор), чтобы вы могли связать дополнительные order позже:

def index
  @items = Item.by_price_ratio
  @items = @items.order(params[:order]) if params[:order]
end
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top