2014-12-22 3 views
0

Take a look at this question.ActiveRecord Rails запрос эффективно

id = current_user.id 
@given_gifts = User.find(id).following_users.includes(:given_gifts).collect{|u| u.given_gifts}.flatten 

@received_gifts = User.find(id).following_users.includes(:received_gifts).collect{|u| u.received_gifts}.flatten 

@gifts = @given_gifts.zip(@received_gifts).flatten.compact 

Я пытаюсь получить список подарков, полученных и предоставленных всеми пользователями, которых следует за текущим пользователем. Есть ли лучший способ сделать это? Результаты не работают и отображаются некоторые дубликаты. Я пытаюсь сделать эффективный запрос, который я могу разбивать на страницы.

В моей User.rb

has_many :given_gifts, class_name: 'Gift', foreign_key: 'giver_id' 
    has_many :received_gifts, class_name: 'Gift', foreign_key: 'receiver_id' 

    acts_as_followable 
    acts_as_follower 

В моей Gift.rb

belongs_to :giver, class_name: 'User' 
belongs_to :receiver, class_name: 'User' 

Для следующей функциональности, я использую acts_as_follower gem.

+1

Можете ли вы поделиться сведениями об ассоциациях following_users, given_gifts и received_gifts? Кроме того, какой заказ вы ожидаете для конечного результата? –

+0

Yup! Конечно, просто отредактировал вопрос. Я пытаюсь получить конечный результат в хронологическом порядке от самого нового до самого старого. Пожалуйста, дайте мне знать, если вам нужны какие-либо другие детали! Благодаря! –

ответ

1

попробовать что-то вроде этого:

following_user_ids = current_user.following_users.pluck(:id) 
Gift.where("(giver_id IN ?) OR (receiver_id IN ?)", 
      following_user_ids, following_user_ids).order(:created_at) 

В основном это получает список following_users идентификаторов, а затем использует запрос или получить подарки, которые даются или полученные любым пользователем в списке.

Производительность этого запроса будет зависеть от базовой базы данных и количества записей, которые вы жонглируете. Но для маленьких # следующих пользователей (< = 100) он, как правило, отлично работает. Производительность ухудшается по мере того, как число next_user_ids поднимается.

+0

Спасибо, что так много! :)) –