2013-04-10 31 views
0

我正在开发一个Rails项目,我有一个用户,has_many团队通过成员资格模型。用户有一个隐私设置,可以是(公共,私人或受保护的)Rails,使用Active Record Query或AREL查找基于共享关联的结果

在当前用户的主页上,我想显示所有用户的个人资料设置为公开,但也有显示其个人资料的用户设置为受保护并与当前用户共享一个团队。

我可以做到这一点作为两个单独的查询,然后结合所得到的数组,但我假设它是“更好”保持它作为一个 - 我认为它也将随着will_paginate表现更好。

我想我可能需要使用Arel是因为.or条件,但只是无法让我的脑袋围绕共享团队所需的联接。

我是AREL,SQL和Stackoverflow的新手,所以如果这没有多大意义,请道歉。

回答

0

我假设如下设置:

class User < AR 
    has_many :memberships 
    has_many :teams, through: :memberships 
end 

class Membership < AR 
    belongs_to :user 
    belongs_to :team 
end 

class Team < AR 
    has_many :memberships 
    has_many :teams, through: :memberships 
end 

那么这应该工作:

sql = <<QUERY 
SELECT users.* FROM users WHERE users.privacy_setting = 'public' 
UNION 
SELECT users.* FROM users JOIN memberships ON users.id = memberships.user_id 
WHERE memberships.team_id IN (#{current_user.team_ids}) 
AND users.privacy_setting = 'protected' 
QUERY 

# use the paginated find_by_sql method (provided by will_paginate) 
User.paginate_by_sql(sql, page: params[:page], per_page: 50) 

当然列名等依赖于你的设置...

PS :不需要AREL,我想...

+0

完美。这正是我需要做的。我会离开AREL玩一天。非常感谢你! – JeremiahAlex 2013-04-11 10:35:45

相关问题