Это не становится намного более оптимизированным, чем то, что вы уже делаете. Ровно ноль из этих операторов будет выполнять 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
?