модель
# app/models/user.rb
class User < ApplicationRecord
has_many :posts
end
# app/models/post.rb
class Post < ApplicationRecord
belongs_to :user
end
Пример без использования includes
# Создаем пользователей и посты
users = (1..10).map { |i| User.create(name: "User #{i}") }
users.each do |user|
(1..5).each { |i| Post.create(title: "Post #{i}", user: user) }
end
# Проверяем первый пост у каждого пользователя без использования includes
users.each do |user|
puts user.posts.first
end
Пример с использованием includes
# Создаем пользователей и посты
users = (1..10).map { |i| User.create(name: "User #{i}") }
users.each do |user|
(1..5).each { |i| Post.create(title: "Post #{i}", user: user) }
end
# Проверяем первый пост у каждого пользователя с использованием includes
users_with_posts = User.includes(:posts).all
users_with_posts.each do |user|
puts user.posts.first
end
Результаты
Без использования includes: В этом случае для каждого пользователя будет выполнен отдельный запрос к базе данных для получения его постов. Если у вас 10 пользователей, то будет выполнено 11 запросов (1 запрос для получения пользователей и 10 запросов для получения постов).
С использованием includes: В этом случае будет выполнен только один запрос для получения всех пользователей и их постов. Общее количество запросов будет равно 2 (1 запрос для пользователей и 1 запрос для постов).
Вывод
Использование includes значительно сокращает количество запросов к базе данных, что улучшает производительность приложения.