ActiveRecord Requête Union

J'ai écrit un couple de requêtes complexes (au moins pour moi) avec Ruby on Rails interface de requête:

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})

Ces deux requêtes fonctionnent très bien par eux-mêmes. Les deux retour de courrier objets. Je tiens à associer à ces postes en un seul ActiveRelation. Car il pourrait y avoir des centaines de milliers de postes à un certain point, ce qui doit être fait au niveau base de données. Si il s'agissait d'une requête MySQL, je pourrais simplement de l'utilisateur de la UNION de l'opérateur. Quelqu'un sait si je peux faire quelque chose de similaire avec RoR de l'interface de requête?

  • Vous devriez être en mesure d'utiliser portée. Créer 2 champs d'application et ensuite appeler comme Post.watched_news_posts.watched_topic_posts. Vous devrez peut-être envoyer dans les params du étendues pour des choses comme la :user_id et :topic.
  • Merci pour la suggestion. Selon les docs, "Un champ d'application représente une réduction d'une requête de base de données". Dans mon cas, je ne suis pas à la recherche, pour des postes qui sont à la fois watched_news_posts et watched_topic_posts. Plutôt, je suis à la recherche pour les postes qui sont en watched_news_posts ou watched_topic_posts, avec pas de doublons autorisés. Est-ce encore possible de le faire avec des étendues?
  • Pas vraiment possible, out-of-the-box. Il existe un plugin sur github appelé l'union, mais il utilise de la vieille école de la syntaxe (méthode de la classe et de hachage requête de style params), si c'est cool avec vous, je dirais aller avec elle... sinon écrire le chemin le plus long dans un find_by_sql dans votre périmètre.
  • Je suis d'accord avec jenjenut233, et je pense que vous pourriez faire quelque chose comme find_by_sql("#{watched_news_posts.to_sql} UNION #{watched_topic_posts.to_sql}"). Je n'ai pas testé que, alors laissez-moi savoir comment ça se passe si vous l'essayez. Aussi, il y a probablement quelques ARel fonctionnalité qui serait à l'œuvre.
  • Eh bien j'ai réécrit les requêtes que des requêtes SQL. Ils travaillent maintenant, mais malheureusement find_by_sql ne peut pas être utilisé avec d'autres chainable requêtes, ce qui signifie que j'ai maintenant réécrire mon will_paginate des filtres et des requêtes ainsi. Pourquoi ne pas ActiveRecord soutenir un union opération?
  • Vous devriez être en mesure d'accomplir ceci avec une jointure externe gauche