/ /単一のクエリで自己結合を介してhas_manyのすべての子を取得 - sql、ruby-on-rails、activerecord、associations

1つのクエリで自己結合によってhas_manyのすべての子を取得する - sql、ruby-on-rails、activerecord、associations

私は記事でいっぱいの図書館を持っています。ある記事が引用を通して他の記事を参照しています。それで、これは引用による自己参照です。

class Article < ActiveRecord::Base
has_many :citations
has_many :referenced_articles, through: :citations
end

class Citation < ActiveRecord::Base
belongs_to :Article
belongs_to :referenced_article, :class_name => "Article"
end

質問: ある記事を与えられて、引用されたものすべてを取得する方法記事:引用されていない記事(私の場合はおそらく15レベル以下の深さ)に達するまで、直接引用されているか間接的に引用されている記事などによって引用されている

私の現在の方法: "main_article"という記事があるとすれば、それを参照することができます

sub_articles = main_article.referenced_articles

そしてさらに一段階深くするために、

sub_articles = Article.eager_load(:referenced_articles).where(id: sub_articles)
sub_sub_articles = sub_articles.collect {|x| x.referenced_articles}.flatten

これをループに入れると、望ましい結果が得られ、反復ごとに1レベル深くなります。 私は現在、すべての記事を2回取得しているので、私はよりよい解決策を望んでいます。

境界条件: ライブラリ内のすべての記事に参照インスタンスを追加したくない(引用)。だから、私は "先祖" gemはオプションではないと思う。

回答:

回答№1は0

再帰クエリの経験はありませんが、データベースエンジンでサポートされている場合は、再帰を使用したcommon-table-expressionsを参照してください。

http://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL#Common_table_expression

Oracle、sqlserver、およびpostgresはすべて再帰的な制御をサポートしているようです。

たぶん、あなた自身が生のSQLを自分で作成しなければならないでしょう、私はあなたがこれを単一の問い合わせでこれを行うためのレールで多くの支持を見つけるのを疑うでしょう。