Rails,使用Active Record Query或AREL查找基于共享关联的结果

时间:2013-04-10 15:14:55

标签: ruby-on-rails activerecord arel

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

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

我可以将它作为两个单独的查询进行组合,然后将结果数组合起来,但我认为将它保持为一个“更好” - 我认为使用will_paginate也会表现得更好。

我认为我可能需要使用Arel,因为.or条件但是无法理解共享团队所需的连接。

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

1 个答案:

答案 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 ......