我正在一个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)
当然列名等取决于你的设置…