2013-06-20 3 views
0

У меня есть приложение Rails со сложным запросом, который я не могу решить. У меня есть 2 стола, клубы и выборы. Таблица клубы просто так:Сложный запрос внешнего внешнего соединения

id,name 
1,A 
2,B 
3,C 
4,D 

Таблица выбор содержит выбранные клубы из таблицы клубов всех пользователей:

id,club_id,user_id 
1,1,1 
2,1,2 
3,2,3 
4,3,1 
5,3,3 

Теперь я хочу, выберите поле со всеми элементами таблицы клубов без элементов уже выбранный текущим пользователем (он не может выбрать тот же клуб дважды). Таким образом, в случае пользователя 1, он должен показывать только клубы B и D, потому что он уже выбрал А и С.

Так что я создал это в качестве рамки в модели:

scope :selectable, ->(current_user) { 
    joins('LEFT OUTER JOIN selections ON selections.club_id = clubs.id'). 
    where('selections.id IS NULL OR selections.user_id != ?', current_user.id). 
    group('clubs.id') 
    } 

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

ответ

1

Я нашел решение, которое, кажется, работает, но я не знаю, если это самый элегантный один:

scope :selectable, ->(current_user) { 
    joins('LEFT OUTER JOIN selections ON selections.club_id = clubs.id'). 
    where('selections.id IS NULL OR selections.user_id != ?', current_user.id). 
    where('clubs.id NOT IN (?)', current_user.clubs). 
    group('clubs.id') 
    } 
+0

Я не знаю о «элегантный», но это, как я хотел бы сделать это, для конечно. – MrTheWalrus