我有一个非常大的数据库,我使用类似于这个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])
正如我所看到的那样,搜索执行第一个条件,然后使用其他条件进行过滤,以便搜索400,000个产品。那会不会扼杀表现,还是我完全(我希望)错了?
注意:我还写过在railscast上问过这个问题但是,作为一个旧的railscast,我不知道是否有人会在那里看到这个问题。出于这个原因,我也在这里写了。
答案 0 :(得分:3)
只使用来自表单的参数中的Hash,已经有一段时间了,因为我已经完成了它并且我甚至不再拥有代码,但理论上它应该是:
finder = Hash.new
params[:form].each {|index, val|
finder[index] = val
}
将创建已传递的所有参数的哈希值,您可以将其传递给活动记录搜索,如下所示。
products = Products.where(finder)
答案 1 :(得分:2)
Rails会将所有.where
条件组合成一个SQL查询。
如果您的数据库已正确编入索引,那么您应该没问题。