2015-09-22 7 views
0

У меня есть приложение 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-запросе, который включает в себя логическое значение, если пользователь следует за другим пользователем?

спасибо, что заранее.

ответ

1

Моей первой мыслью было бы надежно загрузить последователей, используя метод .includes, когда вы получите список пользователей, подобных этому @users = ::User.all.includes(:followers).paginate(page: params[:page]). Но, возможно, я не правильно понимаю ваш вопрос? Дайте мне знать, если это сработает, или если я должен сосредоточить свой ответ на другой теме. Благодаря!

EDIT: Правильный ответ из приведенных ниже комментариев:

Может быть, вы можете попробовать user.followers.include?(current_user) использовать ассоциации предварительно загруженным последователей.

+0

У меня есть «область по умолчанию» в моей модели пользователя, которая автоматически включает последователей. – Tobias

+1

Моя ошибка. Должно быть, я пропустил эту часть, когда впервые прочитал ее. Кажется, что в строке 2 вашего 'jbuilder' вы проверяете, включен ли текущий пользователь в список последователей, но не уверен, что делает метод' follower (user) '. Возможно, вы можете попробовать 'user.followers.include? (Current_user)', чтобы использовать предварительно загруженную ассоциацию последователей. –

+0

Спасибо вам большое! Метод «nclude?» Решил проблему. – Tobias

Смежные вопросы