Заголовок может показаться немного загадочным, но суть задачи заключается в том, чтобы сделать категорию «приватной», но при этом найти способ идентифицировать всех пользователей, которые участвовали в ней в прошлом за указанный , и добавить их в группу, чтобы затем предоставить им доступ.
Предположим, что группа может быть создана заранее.
В настоящее время поддерживается следующее:
Создание группы
Назначение прав группы для категории
Изменение прав доступа к категории
Отсутствует возможность указать «добавить этих пользователей в группу» на основе их взаимодействия в данной категории за определённый промежуток времени.
Возможно, существует запрос или код, который я могу выполнить, чтобы идентифицировать этих пользователей и добавить их в группу?
Я использовал запрос Data Explorer, чтобы определить, кто участвовал в теме на основе user_actions:
-- [params]
-- int :topic = 3620561
select user_id,
sum(action_type) actions,
sum(case action_type when 5 then 1 else 0 end) replies
from user_actions ua
join users u on u.id = ua.user_id
where target_topic_id = :topic
and moderator is false
and admin is false
group by ua.user_id
Это включает такие действия, как ответы, лайки, правки и упоминания. У меня также есть запрос, который включает ответы на опросы. Это было для сбора потенциальных клиентов, но я ожидаю, что некоторые из тех, кто что-то сделал, кроме ответа, могут иметь отношение к теме. Определение «участия» может быть полезным упражнением.
Чтобы расширить запрос на всю категорию, присоединитесь к topics t on target_topic_id = t.id и добавьте category_id в условие where. Определить временной интервал на основе ua.created_at не должно составить труда.
Я предполагаю, что можно передать результаты в запрос, который добавит всех пользователей в группу. У кого-нибудь есть опыт выполнения такой задачи? Может быть, лучше просто скопировать и вставить идентификаторы пользователей и запустить функцию на Ruby, если такая имеется?
Обычно я предпочитаю именно такое решение. Но, вероятно, имеет смысл воспользоваться примером из примеров массовых операций и применить предложение where к объекту User в Rails. (Наличие тестовой среды в такой ситуации очень помогает!)
В зависимости от количества пользователей, вы можете вставить список через запятую в поле «Добавить пользователей в группу», если это вам подходит?
(Также существует автоматизация для добавления пользователей в группу на основе бейджа, где вы можете использовать этот SQL как основу. Однако это может оказаться немного запутанным, если вы предпочитаете вариант с Rails).
Оставьте этот запрос на случай, если он понадобится другим:
select ua.user_id, u.username, sum(action_type) actions, sum(case action_type when 5 then 1 else 0 end) replies from user_actions ua
join users u on u.id = ua.user_id
join topics t on target_topic_id = t.id
where ua.created_at > 'YYYY-MM-DD'::date and t.category_id = CATEGORY_ID
group by ua.user_id, u.username;
Просто замените YYYY-MM-DD на вашу дату отсечения, а CATEGORY_ID — на идентификатор вашей категории.
В результате будут отображены user_id, username, actions и replies.
У меня есть список идентификаторов пользователей (или даже их имён), и мне нужно добавить их в группу.
В текущих автоматизациях я не вижу подходящего сценария использования. Есть только добавление в группу на основе бейджей или пользовательских полей, но это означает лишь дополнительный шаг (добавление бейджа всем этим пользователям или добавление пользовательского поля пользователям, а затем присвоение значения конкретным пользователям, которых я хочу добавить).
Разве нет функции bulk_add_user_to_group или даже add_user_to_group, которую я мог бы просто вызывать в цикле?
Да, такой способ будет немного более запутанным. Но если у вас есть список небольшой длины, вы можете экспортировать результаты обзора в CSV-файл, открыть его в Блокноте и скопировать и вставить их в поле «Добавить пользователей»:
Возможно, можно обработать сразу 250 записей, хотя я не пробовал с таким количеством. Однако, если нет, то несколько пакетов должны справиться.
Также это можно сделать через API, отправив PUT-запрос на конечную точку, например /groups/49/members.json (вам понадобится ваш собственный group_id), со списком ваших имён пользователей или адресов электронной почты.