我在下面有这个巨大的丑陋查询,我想在目录视图中按它排序。想象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
答案 0 :(得分:0)
不确定这与ROR有什么关系,但无论如何:
您的SELECT子句中有100 - round((current_price / item.estimated_price)*100) as percent
,但无论如何在WHERE条件中使用相同的表达式。
item.estimated_price
可以小于零吗?如果不是item.estimated_price > 0
条件过多,如果它为零,则(100 - round((current_price / item.estimated_price)*100)) > 49
条件将为假
由于同样的原因,(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
这并没有改善这种情况,但如果不了解有关数据库架构的更多原因,我就不能说更多。
BTW你问题中的链接不起作用(这显然是你的本地链接)
答案 1 :(得分:0)
建立二进制代码的答案,你可以尝试在ARel中包装你的查询,然后在你的控制器动作中你在params散列中传递的字段上订购,如下所示:
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
模型中的方法,并确保仍然返回{{1来自它的对象(就像当前语句一样),所以你可以稍后链接额外的Relation
:
order