ROR - Активная запись избегает n + 1 запросов - PullRequest
0 голосов
/ 11 октября 2018

У меня есть модель (Новости), связанная с другой моделью (Категория), поэтому в модели новостей у меня есть:

has_and_belong_to_many :news_categories, join:table: 'news_categories_news'

Я хочу взять все новости со своими категориями, поэтому:

News.find(/*conditions*/).includes(:news_categories)

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

@news.news_categories

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

ps: извините за мой английский ...

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Спасибо всем, но я решил с помощью eager_load() Он генерирует только один запрос!

0 голосов
/ 11 октября 2018

Прежде всего, .includes не может работать при цепочке после .find.Причина - find будет не возвращаться ActiveRecord::Relation, который необходим для реляционной цепочки;он скорее вернет соответствующий News объект или ошибку.

Вы должны сделать:

@all_news = News.includes(:news_categories).where(id: 1)
@news = @all_news.first
@news.news_categories # shouldn't invoke new query
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...