Rails,使用活动记录查询或AREL查找基于共享关联的结果



我正在一个rails项目中工作,其中我有一个User,它通过会员模型拥有_many Teams。用户有一个隐私设置,可以是(公共的,私人的或受保护的)

在当前用户的主页上,我想显示所有将其配置文件设置为public的用户,以及将其配置文件设置为protected并与当前用户共享团队的用户。

我可以这样做作为两个单独的查询,然后组合结果数组,但我假设它是"更好"保持它作为一个-我认为它也会表现得更好与will_paginate。

我想我可能需要使用Arel,因为。or条件,但只是不能得到我的头周围需要工作共享团队的连接。

我是新来的AREL, SQL和Stackoverflow的问题,所以抱歉,如果这不是很有意义。

我假设如下设置:

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)

当然列名等取决于你的设置…

最新更新