Поиск отношения без второго запроса - PullRequest
0 голосов
/ 07 июня 2011

Мой вопрос о том, как выполнять различные уровни поиска в базе данных при ограничении количества запросов.

Давайте начнем с простого:

@companies = Company.where("active = ?", true)

Допустим, мы отображаем записи из этого набора. Тогда нам нужно:

@clientcompanies = @companies.where("client_id = ?", @client.id)

Мы показываем что-то из @clientcompanies. Затем мы хотим углубиться в детали.

@searchcompanies = @clientcompanies.where("name LIKE ? OR notes LIKE ?", "#{params[:search]}%", "#{params[:search]}%")

Являются ли эти три утверждения наиболее эффективным способом решения этой проблемы?

Если база данных действительно начинается со всей таблицы Company каждый раз, есть ли способ ограничить область действия, чтобы каждое из приведенных выше утверждений занимало более короткое время по мере уменьшения размера набора?

Если это имеет значение, я запускаю Rails 3 как на MySQL, так и на PostgreSQL.

1 Ответ

0 голосов
/ 07 июня 2011

Это не становится намного более оптимизированным, чем то, что вы уже делаете. Ровно ноль из этих операторов будет выполнять SQL-запрос до тех пор, пока вы не попытаетесь перебрать результаты. Вызов методов, таких как all, first, inspect, any?, each и т. Д., Будет выполняться при выполнении запроса.

Каждый раз, когда вы включаете новый where или другой метод arel, он добавляет к SQL-запросу, который он выполнит в конце. Если где-то посередине вы хотите увидеть запрос, который будет выполнен, вы можете выполнить puts @searchcompanies.to_sql

Обратите внимание, что если вы запускаете эти команды в консоли, кажется, что каждый оператор запускает SQL-запрос только потому, что консоль автоматически запускает .inspect на введенной вами строке.

Надеюсь, я ответил на ваш вопрос:)

Здесь есть отличный Railscast: http://railscasts.com/episodes/239-activerecord-relation-walkthrough, который объясняет, как работает ActiveRelation и что вы можете с ним сделать.

EDIT:

Возможно, я неправильно понял ваш вопрос. Вы указали, что после каждого where вызова вы отображали информацию из запроса. Какой вариант использования для этого? Отображаете ли вы все компании на той же странице, что вы отфильтровали компании из поиска? Если вы отобразите что-то из этого самого первого запроса, то вы будете извлекать каждую строку компании из вашей базы данных (которая не будет очень масштабируемой или производительной при большем количестве записей компании).

Не имеет ли смысла выводить информацию только из переменной @searchcompanies?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...