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 上写过这个问题,但是,作为一个旧的 railscast,我不知道是否有人会在那里看到这个问题。出于这个原因,我也在这里写了。

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条件组合到一个 SQL 查询中。

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

于 2012-07-14T12:11:09.880 回答