У меня есть приложение rails-api, в котором пользователи могут следить за другими пользователями.Проверьте, присутствует ли запись в ассоциации с многочисленными
Чтобы проверить, не следует ли пользователю следовать за другим пользователем, мне нужно включить запрос в атрибуты, и из-за этого у меня всегда есть проблема с запросом N+1
.
Вот мой код:
Index
действие контроллера пользователя:
def index
@users = ::User.all.paginate(page: params[:page])
end
Последователи всегда будут включены в default_scope
в User
модели.
index.json.jbuilder:
json.partial! 'attributes', collection: @users, as: :user
_attributes.json.jbuilder:
json.extract! user, :id, :firstname, :lastname, :username, :follower_count
is_follower = user.follower.find_by(id: current_user.id).present? if current_user
json.following is_follower
И как результат:
User Load (0.1ms) SELECT "users".* FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."follower_id" WHERE "relationships"."followed_id" = $1 [["followed_id", 14]]
Rendered v1/user/users/_attributes.json.jbuilder (1.3ms)
User Load (0.1ms) SELECT "users".* FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."follower_id" WHERE "relationships"."followed_id" = $1 [["followed_id", 9]]
Rendered v1/user/users/_attributes.json.jbuilder (1.4ms)
User Load (0.1ms) SELECT "users".* FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."follower_id" WHERE "relationships"."followed_id" = $1 [["followed_id", 13]]
Есть ли обходной путь или его как-то возможно создать динамический атрибут в SQL-запросе, который включает в себя логическое значение, если пользователь следует за другим пользователем?
спасибо, что заранее.
У меня есть «область по умолчанию» в моей модели пользователя, которая автоматически включает последователей. – Tobias
Моя ошибка. Должно быть, я пропустил эту часть, когда впервые прочитал ее. Кажется, что в строке 2 вашего 'jbuilder' вы проверяете, включен ли текущий пользователь в список последователей, но не уверен, что делает метод' follower (user) '. Возможно, вы можете попробовать 'user.followers.include? (Current_user)', чтобы использовать предварительно загруженную ассоциацию последователей. –
Спасибо вам большое! Метод «nclude?» Решил проблему. – Tobias