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

バイナリコードの答えを構築して、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

編集

以下の binarycode が指摘しているように、メイン クエリをアクションの外に移動して、おそらくモデル内のメソッドに移動し、(現在のステートメントのように) そこからオブジェクトを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 に答える
0

これがRORにどのように関連するかはわかりませんが、とにかく:

  1. SELECT 句に含まれていますが100 - round((current_price / item.estimated_price)*100) as percent、とにかく WHERE 条件で同じ式を使用しています。

  2. item.estimated_priceゼロ未満になることはありますか? item.estimated_price > 0条件が過剰でない場合、ゼロの場合、条件(100 - round((current_price / item.estimated_price)*100)) > 49は false になります

  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

これで状況が大きく改善されるわけではありませんが、DB アーキテクチャについてこれ以上の理由を知らなければ、これ以上のことは言えません。

ところで、あなたの質問のリンクは機能しません(明らかにあなたのローカルリンクです)

于 2012-07-26T06:16:48.737 に答える