0

私は、レストランがオンラインでメニューを作成できるようにするレストラン アプリケーションを作成しています。現在、ページは最初のページ読み込みで 6 つのアイテムを読み込みます。その後、無限スクロール インタラクションが引き継ぎ、ページを下にスクロールし続け、AJAX を介してさらに 6 つのアイテムを動的に読み込みます。

すべてが機能していますが、データベースの関連付けのフィールドを制限するのに問題があります。たとえば、私のアイテムには独自のサイズがあり、アイテム モデルで確立されています。

has_many :sizes

次に、これらのサイズにアクセスします

item.sizes

json から返されるデータを整理するために、次の方法を使用します (ただし、この方法の改善は大歓迎です)。

items = Item.where("blah blah")
items.each do |item|
    item[:sizes] = item.sizes
end

render :json => {:items => items}

これはすべて機能し、十分に単純ですが、データベースから返される選択された列を制限しようとすると、奇妙な動作が発生し始めます。何が原因なのかわかりません。私はこれをやってみました:

item[:sizes] = item.sizes.select("id, name, price")

そして私もこれをやろうとしました:

item[:sizes] = item.sizes.to_json(:only => [:id, :name, :price])

これらのメソッドは両方とも、サーバー側で要求されたフィールドのみを返すように機能しますが、要求と Web ブラウザーへの戻りの間に何かが発生するようです (私の推測では、render メソッドが原因であると思われます)。独自のフィールド セレクターを元に戻し、代わりにすべてのデータベース データを送り返します (そのため、ID、名前、価格だけでなく、約 20 の不要なデータ フィールドを受信して​​います)。

この作業に役立つ可能性のある提案を探しています。また、クエリ時間を改善する方法について他の情報があれば、それも大歓迎です。私はすでにすべての基本的なチュートリアルをカバーしており、アイテムにアクセスする前にすでに熱心な読み込みを使用しています (それが私の問題と関係があるのでしょうか?) が、ボトルネックが発生しないようにするための良い解決策を見つけようとしています.これらの to_json および render :json メソッドによって。

現在、データベースで約 400 ミリ秒かかる一連のクエリは、render :json でさらに 1000 ミリ秒かかっています。

4

1 に答える 1