0

我正在开发一个 Rails 项目,我有一个用户,通过会员模型拥有多个团队。用户有一个隐私设置,可以是(公共的、私人的或受保护的)

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

我可以将其作为两个单独的查询来执行,然后组合生成的数组,但我假设将其保持为一个“更好” - 我认为它也会在 will_paginate 中表现得更好。

我认为由于 .or 条件,我可能需要使用 Arel,但我无法理解建立共享团队所需的联接。

我是 AREL、SQL 和 Stackoverflow 的新手,如果这没有多大意义,我深表歉意。

4

1 回答 1

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,我想...

于 2013-04-10T15:31:34.643 回答