Я думаю, что ваше текущее решение в порядке в случае устаревшей БД. Как собственный запрос, он также наиболее эффективен, поскольку ваша СУБД выполняет всю тяжелую работу (объединение, сортировка, ограничение).
Если вы действительно хотите избавиться от SQL UNION без изменения схемы, вы можете переместить объединение в сумму массива Ruby - но это может быть медленнее.
result = RatedActivity.
select("*, null as queue_id, 3 as model_table_type").
where(:user_id=>friend_ids).
limit(100).all +
QueuedActivity...
Наконец, вам нужно отсортировать и ограничить этот продукт с помощью
result.sort(&:activity_datetime)[0..99]
Это просто подтверждение концепции, поскольку вы видите, что некоторые пункты неэффективны (3 запроса, сортировка в Ruby, ограничение). Я бы остался с find_by_sql
.