Вопрос по оптимизации Rails - PullRequest
       1

Вопрос по оптимизации Rails

0 голосов
/ 20 августа 2010

В Rails при использовании activeRecord почему запросы на объединение считаются плохими.

Например

Здесь я пытаюсь найти количество компаний, принадлежащих к определенной категории.

<code>
  class Company ActiveRecord::Base
    has_one :company_profile
  end  

Поиск номера компании для определенного идентификатора категории

number_of_companies = Company.find(:all, :joins=>:company_profile, :conditions=>["(company_profiles.category_id = #{c_id}) AND is_published = true"])   

Как это может быть лучше или это просто плохой дизайн?


  company_profiles = CompanyProfile.find_all_by_category_id(c_id)
  companies = []
  company_profiles.each{|c_profile| companies.push(c_profile.company) } 
</code> 

Разве это не лучше?что первый запрос создает один запрос, в то время как я выполняю несколько запросов для второго случая.

Может кто-нибудь объяснить, почему объединения в Rails считаются плохой практикой

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 20 августа 2010

Насколько мне известно, такого правила не существует.Правило состоит в том, чтобы обращаться к базе данных как можно меньше, и rails дает вам подходящие инструменты для этого, используя объединения.

Пример, который Сэм приводит выше, является образцовым.Простой код, но за кулисами рельсы должны сделать два запроса, а не только один, используя объединение.

Если есть одно правило, которое мне приходит на ум, которое, я думаю, связано, - избегать SQL, где это возможнои используйте рельсы как можно больше.Это делает вашу базу данных независимой (так как rails обрабатывает различия для вас).Но иногда даже это неизбежно.

Все сводится к хорошему дизайну базы данных, созданию правильных индексов (которые необходимо определить вручную при переносе), а иногда требуются большие вложенные структуры / объединения.

1 голос
/ 20 августа 2010

Запросы на присоединение неплохие, на самом деле они хорошие, и ActiveRecord имеет их в самом сердце. Вам не нужно заходить в find_by_sql, чтобы использовать их, такие опции как: include помогут вам. Вы можете остаться в рамках ORM, что обеспечивает удобочитаемость и простоту использования, в то же время, по большей части, создавая очень эффективный SQL (при условии, что ваши индексы правильные!)

Итог - вам нужно сделать минимум операций с базой данных. Объединения - это хороший способ позволить базе данных выполнить тяжелую работу за вас и снизить количество выполняемых вами запросов.

Кстати, DataMapper и Arel (механизм запросов в Rails 3) имеют большую ленивую загрузку - это означает, что такой код:

@category = Category.find(params[:id])
@category.companies.size

Скорее всего, это приведет к запросу соединения, который будет выполнять только операцию COUNT, поскольку первая строка не приведет к отправке запроса в базу данных.

0 голосов
/ 20 августа 2010

Если вы просто хотите узнать количество компаний в категории, все, что вам нужно сделать, это найти категорию, а затем вызвать имя и размер ассоциации, потому что она вернет массив.

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