В разработке приложений на Ruby on Rails частой задачей — скорость загрузки данных. Эта статья предлагает решения для использования eager loading, позволяя загружать эти о постах и лайках пользователей одновременно. Такой подход существенно повышает производительность приложений и уменьшает количество запросов к базе данных.
Почему это важно
Некоторые разработчики сталкиваются с проблемами, когда хотят узнать, как загрузить ассоциации, связанные с пользователем. Например, как проверить, лайкнул ли пользователь пост или — ли он другом другого пользователя. Как правило, обычные запросы могут перерастать в накладные расходы при увеличении объема данных, что делает необходимость в правильном использовании eager loading актуальной для большинства проектов.
Как реализовать eager loading в Rails
Эта статья предлагает несколько конкретных шагов. Прежде всего, необходимо создать класс Current, который будет хранить user_id:
class Current < ActiveSupport::CurrentAttributes
attribute :user_id
end
Затем, перед каждым запросом, идентификатор текущего пользователя должен быть установлен в ApplicationController:
class ApplicationController < ActionController::Base
before_action :set_user_id, if: :user_signed_in?
protected
def set_user_id
Current.user_id = current_user.id
end
end
После этого можно установить ассоциацию между моделью Post и Like, что позволит загружать эти о лайках:
class Like < ApplicationRecord
belongs_to :post
belongs_to :user
end
Далее добавьте ассоциацию has_many в модель Post, которая будет затрагивать текущего пользователя:
class Post < ApplicationRecord
belongs_to :user
has_many :likes, dependent: :destroy
has_many :liked, -> { where(id: Current.user_id) }, through: :likes, source: :user
end
Применение в контроллерах и представлениях
Теперь можно использовать eager loading в контроллерах. Например, в PostsController вы можете загрузить посты и их лайки следующим образом:
class PostsController < ApplicationController
before_action :authenticate_user!
def index
@posts = Post.eager_load(:liked).all
end
end
В представлениях можно легко проверить статус лайков для каждого поста.
Вывод для разработчиков
Использование eager loading позволяет значительно улучшить производительность ваших Rails приложений. Это не только снижает число запросов к базе данных, но и упрощает логику кода, что особенно важно для команд, работающих с масштабируемыми проектами. Правильная реализация этого метода поможет избежать множества проблем, связанных с медленными запросами.
В скором будущем биланди подход к разделению и оптимизации нагрузки на БД только укрепится, и разработчикам стоит внимательнее изучать возможности, которые предоставляет Rails.


