私はモデルを持っており、この例ではProduct
モデルと呼ぶことができます。私はこのデータベースに約200kレコードあり、半分はactive
(active: true
)で、半分はそうではありません。ユーザーが商品の検索を行っているときには、アクティブな商品のみを表示する必要があります。私のコードは次のようなものになります。そうRails:検索結果をメモリにロードせずにフィルタリングする方法
def self.search
products = Products.where(active: true).order("`foo` = 'BAR'")
products = products.where(other_filters)
products = products.where(more_filters)
..
end
がメモリに最初の100kのアクティブなものをロードする(最初where
戻っ100000
後puts products.size
をやって)、これらは、その後の連鎖where
句で約20回以上ダウン濾過し、最後にページが表示されるので、25個しか表示されません。これらの結果をより効率的にフィルタリングする方法はありますか?
あなたはActiveRecordのようないくつかのORMを使用していますか? .whereを連鎖するだけで、データベースがすべてのフィルタに一致するものを返すようにすることができます。 –
ActiveRecordチェーンでは、 '.where'は1つのクエリを作成します。また、['.merge'](http://api.rubyonrails.org/classes/ActiveRecord/SpawnMethods.html#method--merge)を使ってスコープをマージすることもできます。あなたは本当にそれを解決するためのよりclunkyな方法を探していますか? – max