我正在开发一个我有一个用户的rails项目,通过一个会员模型有很多团队。用户具有隐私设置,可以是(公共,私人或受保护)
在当前用户的主页上,我希望显示将其个人资料设置为公开的所有用户,以及将其个人资料设置为受保护并与当前用户共享团队的用户。
我可以将它作为两个单独的查询进行组合,然后将结果数组合起来,但我认为将它保持为一个“更好” - 我认为使用will_paginate也会表现得更好。
我认为我可能需要使用Arel,因为.or条件但是无法理解共享团队所需的连接。
我是AREL,SQL和Stackoverflow的新手,所以如果这没有多大意义,请道歉。
答案 0 :(得分: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 ......