大型数据库中的高级搜索轨道

时间:2012-07-14 12:08:20

标签: ruby-on-rails-3 activerecord advanced-search

我有一个非常大的数据库,我使用类似于这个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,我不知道是否有人会在那里看到这个问题。出于这个原因,我也在这里写了。

2 个答案:

答案 0 :(得分:3)

只使用来自表单的参数中的Hash,已经有一段时间了,因为我已经完成了它并且我甚至不再拥有代码,但理论上它应该是:

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

将创建已传递的所有参数的哈希值,您可以将其传递给活动记录搜索,如下所示。

products = Products.where(finder)

答案 1 :(得分:2)

Rails会将所有.where条件组合成一个SQL查询。

如果您的数据库已正确编入索引,那么您应该没问题。