Повышение производительности при получении значений атрибутов ассоциации записей класса - PullRequest
1 голос
/ 07 июля 2011

Я использую Ruby on Rails 3.0.7, и я хотел бы улучшить следующий код:

@user.article_relationships.select(:category_id).map(&:category_id)

Где:

  • @user является экземпляром класса User
  • article_relationships - это метод, "полученный" Ассоциацией активных записей пользователя с классом Article
  • :category_id является атрибутом каждого article_relationships (то есть столбец таблицы базы данных article_relationships)

Вывод приведенного выше кода выглядит примерно так:

# Those are all 'category_id' values present in the 'article_relationships' array
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Существует способ улучшить этот код для повышения производительности (в основном для select(:category_id).map(&:category_id) части) ? То есть существует "прямой "способ получения category_id данных?

Ответы [ 3 ]

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

Вы можете использовать энергичную загрузку, используя include при поиске @ объекта пользователя

или напрямую пропустить select

@user.article_relationships.map (&: category_id)

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

Как ответил другой человек, прямого или рекомендуемого способа сделать это не существует.

Основной совет - не повторять результаты дважды, map () просматривает каждый результат и вызывает .company_id, если вы собираетесь повторить результаты снова, оставьте .map выключенным и вызовите .company_id самостоятельно, когда тебе это нужно.

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

Одним словом ... нет.Нет более "прямого" способа доступа к category_ids.Хотя некоторые примечания:

  • Вам не нужно делать .select(:category_id).Если записи статей не содержат большого количества данных, повышение производительности будет незначительным.@user.article_relationships.map(&:category_id) должно сработать.

  • Больше всего, чем вы могли бы получить, это индексирование столбца user_id в таблице статей.Это легко сделать в процессе миграции: add_index :articles, :user_id.

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