Я также столкнулся с этой проблемой, и теперь моя стратегия перехода состоит в том, чтобы сгенерировать SQL (вручную или с помощью to_sql
в существующей области видимости), а затем вставить его в предложение from
. Я не могу гарантировать, что он более эффективен, чем ваш принятый метод, но он относительно прост для глаз и возвращает нормальный объект ARel.
watched_news_posts = Post.joins(:news => :watched).where(:watched => {:user_id => id})
watched_topic_posts = Post.joins(:post_topic_relationships => {:topic => :watched}).where(:watched => {:user_id => id})
Post.from("(#{watched_news_posts.to_sql} UNION #{watched_topic_posts.to_sql}) AS posts")
Вы также можете сделать это с двумя разными моделями, но вам нужно убедиться, что они оба "выглядят одинаково" внутри UNION - вы можете использовать select
для обоих запросов, чтобы убедиться, что они будут производить одинаковые столбцы .
topics = Topic.select('user_id AS author_id, description AS body, created_at')
comments = Comment.select('author_id, body, created_at')
Comment.from("(#{comments.to_sql} UNION #{topics.to_sql}) AS comments")