2013-01-11 1 views
5

Railsアプリケーションでは、3つのモデル(投稿、ショップ::アイテムとディレクトリ::アイテム)があります。すべてのモデルは他のモデル(ユーザー、カテゴリ、市...)との関係を持っています。このすべての情報はメインページに表示する必要があります。それはアイテムのページ付けリストのように見えるはずです。私はDBのポストグルを使用しています。
私たちは、コントローラでこのようなコードを書くことができます。Railsアプリ。いくつかのモデルからアイテムを収集し、このページ番号を付けたメインページのリストを表示します

@postings = Posting.includes(:category, :subcategory, :user, :city).all 
@directory_items = Directory::Item.includes(:category, :user, :city).all 
@shop_items = Shop::Item.includes(:category, :user, :city, :phone).all 

をし、この結果をソート。しかし、それは最善の方法ではありません。

第2の解決方法は、ActiveRecordを除くカスタムクエリを書き込むことです。しかし、このクエリは非常に大きく、サポートするのは難しいでしょう(我々はそこにたくさんの結合を持っています)
DBクエリーの量が最も少ないのは何のための最良の解決策ですか? (これはメインページなので、とても速く動作するはずです)。

+0

私たちにいくつかのコードを教えてください。 [何を試してみましたか?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – weltschmerz

+0

実装方法をいくつか追加しました。しかし、私はそれらのソリューションが気に入らない。だからこそ質問しています。 – jizak

答えて

2

hereでは高速ではない解決策がいくつかあります。

sphinxthinking sphinx gemを使用することもできます。この方法で、それは速くてきれいになるでしょう。

ThinkingSphinx.search classes: [Posting, Shop::Items, Directory::Items], page: params[:page] || 1, per_page: 10 
0

クエリがキャッシュされるため、ソートには時間がかかります。あなたがあまりにも多くのアイテムを表示しない場合、開発者の可読性はこれを最適化するためのコストをはるかに上回ります。パフォーマンスが実際にボトルネックになっている場合は、常にそれを改善することができますが、このコードを過度に複雑にする代替方法はあります。

関連する問題