2

私は、(この質問のために)Posts複数にリンクされているRails 3アプリケーションに取り組んでおりCategories、その逆も同様has_and_belongs_to_manyです。

Post < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

Category < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

私は、投稿が2つの両方にリンクされているすべてのPosts場所を取得するActiveRecord(またはARel)ファインダーを作成する方法を理解しようとしています。私は最終的に生成しようとしているSQLを理解しています(2つのそれぞれの一致のためにそれぞれを区別できるようにするためのエイリアスを持つ2つの内部結合)が、これまでのところ、なしでクエリを作成する方法を理解していません生のSQLビットに頼る。CategoriesCategories

この場合、カスタムSQLを回避することが非常に重要である理由は、私が書いているコードが一般的でデータ駆動型であり、Postオブジェクトのクエリで他のフィルタリング(および並べ替え)修飾子と混合する必要があるためです。他のフィルターによって生成されたSQLとうまく混ざらない可能性のあるメソッド呼び出しPost(たとえば、のコレクションにアクセスするため)またはカスタムSQLのいずれかをハードコーディングするだけです。Categories

どういうわけかそれが物事を簡単にする場合、または他のORMオプション(DataMapper、Mongoidなど)を検討する場合でも、結合モデル(has_many :through)の使用に切り替えることはできますが、それは非常に基本的なものを機能させるための大きな変更のようです。

ActiveRecord / ARelではこれが簡単ではなく明白ではないことに驚いていますが、答えを見つけるために検索する魔法のキーワードがわからないのかもしれません。ARelのドキュメントも驚くほどスリムなので、途方に暮れています。どんな助けでも大歓迎です!

4

1 に答える 1

1

かなりのグーグル検索を行った後、次の 2 つの記事 (2006 年から!) を見つけ、最終的に ActiveRecord/ARel の正しい答えにたどり着きました。

http://blog.hasmanythrough.com/2006/6/12/when-associations-arent-enough

http://blog.hasmanythrough.com/2006/6/12/when-associations-arent-enough-part-2

私が探しているものを生成する (ほぼ) SQL を使用しないコードは、 SQL でGROUP BYandHAVING演算子を非常に巧妙に使用したものです。

Post.joins(:categories).where("categories.name" => ['catA','catB']).group('posts.id').having('COUNT(posts.id) = 2')

基本的に、指定された(複数の に一致することが期待される場合は重複を含む)、 のフィールドでリストされているグループのいずれかPostsに関連付けられているすべてを検索し、結果をトリミングして、正確に の数を持つグループのみを含めます。私たちが望む試合。CategoriesPostsCategoriesidPost

このコードを の他のフィールドのフィルターと混ぜて試したことはありませんが、うまくいくとPost確信しています。

于 2012-03-05T05:47:45.930 に答える