0

私は非常に大きなデータベースを持っており、この Railscast に似た高度な検索フォームを使用しています: http://railscasts.com/episodes/111-advanced-search-form-revised

ばかげた質問かもしれませんが、400,000 (またはそれ以上) の製品があり、このチェーン.where(およびページネーション) でフィルタリングしていると想像してください。

products = Product.order(:name)
products = products.where("name like ?", "%#{keywords}%") if keywords.present?
products = products.where(category_id: category_id) if category_id.present?
products = products.where("price >= ?", min_price) if min_price.present?
products = products.where("price <= ?", max_price) if max_price.present?
products.page(params[:page])

ご覧のとおり、検索では最初の条件が実行され、次に他の where 条件でフィルター処理されるため、400,000 個の製品が検索されます。それはパフォーマンスを犠牲にしないでしょうか、それとも私は完全に(私が望む)間違っていますか?

注: Railscast でもこの質問を書いたことがありますが、古い Railscasts であるため、その質問が誰かに表示されるかどうかはわかりません。せっかくなのでここにも書きました。

4

2 に答える 2

3

フォームからのパラメーターからハッシュを使用するだけです。これを実行してからしばらく経ちましたが、コードはもうありませんが、理論的には次のようになります。

finder = Hash.new
params[:form].each {|index, val|
finder[index] = val
}

これにより、渡されたすべてのパラメーターのハッシュが作成され、このようにアクティブなレコード検索に渡すことができます。

products = Products.where(finder)
于 2012-07-14T12:25:55.243 に答える
2

Rails は、これらすべての.where条件を 1 つの SQL クエリにまとめます。

データベースのインデックスが正しく作成されていれば問題ありません。

于 2012-07-14T12:11:09.880 に答える