расширенные поисковые рельсы в большом БД

У меня очень большая база данных, и я использую форму расширенного поиска, похожую на этот 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, но, поскольку я уже старый, я не знаю, увидит ли кто-нибудь там этот вопрос. По этой причине я тоже написал здесь.


person Nunzio Fiore    schedule 14.07.2012    source источник


Ответы (2)


просто используйте хэш из параметров, которые поступают из формы, прошло некоторое время с тех пор, как я это сделал, и у меня даже нет кода, но теоретически это должно быть примерно так:

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

это создаст хэш всех переданных параметров, и вы можете просто передать его активному поиску записи, как это.

products = Products.where(finder)
person merlin371    schedule 14.07.2012

Rails объединит все эти .where условия в один SQL-запрос.

Если ваша база данных правильно проиндексирована, все должно быть в порядке.

person thomasfedb    schedule 14.07.2012
comment
отличный @thomasfedb, это то, что я хотел ... так что запрос не выполняется до запуска .page! - person Nunzio Fiore; 14.07.2012