【问题标题】:advanced search rails in a large db大型数据库中的高级搜索轨道
【发布时间】:2012-07-14 01:53:03
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    只需使用来自表单的参数的哈希值,我已经有一段时间没有完成它了,我什至没有代码了,但理论上它应该是这样的:

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

    这将为所有已传递的参数创建一个哈希,您可以像这样将其传递给活动记录搜索。

    products = Products.where(finder)
    

    【讨论】:

      【解决方案2】:

      Rails 会将所有这些.where 条件组合到一个 SQL 查询中。

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

      【讨论】:

      • 太棒了 @thomasfedb ,这正是我所希望的......所以直到 .page 指令才会执行查询!
      猜你喜欢
      • 2020-07-25
      • 2011-01-31
      • 2017-12-26
      • 2020-06-08
      • 2011-12-25
      • 1970-01-01
      • 2010-11-03
      • 2013-10-31
      • 1970-01-01
      相关资源
      最近更新 更多