0

我在下面有这个巨大的丑陋查询,我想在目录视图中对其进行排序。想像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
4

2 回答 2

0

不确定这与 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

这并没有大大改善这种情况,但是如果不知道有关您的数据库架构的更多原因,我不能说更多。

顺便说一句,您问题中的链接不起作用(显然是您的本地链接)

于 2012-07-26T06:16:48.737 回答
0

在 binarycode 的答案的基础上,您可以尝试将查询包装在 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
于 2012-07-26T06:26:46.293 回答