2013-04-10 3 views
0

Я работаю над проектом рельсов, где у меня есть Пользователь, который has_many Teams через модель членства. Пользователь имеет настройку конфиденциальности, которая может быть (общедоступной, частной или защищенной).Рельсы, поиск результатов на основе общей ассоциации с использованием запроса активной записи или AREL

На домашней странице пользователя я хочу показать всех пользователей, у которых их профили установлены на общедоступные, а также пользователей, имеющих свой профиль установленный для защиты и совместного использования команды с текущим пользователем.

Я мог бы сделать это как два отдельных запроса, а затем объединить результирующие массивы, но я предполагаю, что «лучше» сохранить его как единое целое. Думаю, он также будет вести себя лучше с will_paginate.

Я думал, что мне, возможно, понадобится использовать Arel из-за условия .or, но просто не могу получить голову вокруг соединений, необходимых для разработки общих команд.

Я новичок в AREL, SQL и Stackoverflow, поэтому приношу извинения, если это не имеет большого смысла.

ответ

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, я думаю ...

+0

Perfect. Это именно то, что мне нужно. Я оставлю играть с AREL еще на один день. Большое спасибо! – JeremiahAlex