2013-06-20 118 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,因为他已经选择了A和C.

所以我创造了这个作为模型范围:

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