2011-01-21 8 views
0

でクエリに参加し、私はその後、私はまた、付属のいくつかのタグを持っているいくつかの記事を持っているいくつかのタグ複雑なアクティブ・リレーションアクティブ関係Railsは、複数のリレーショナル表

User 
    has_many :tag_followings 
    has_many :tags, :through => :tag_followings 

「に従う」ことができ、ユーザのモデルを持っています。 USER_IDと をTAG_IDとtag_followingがあるのフィールドがあるテーブルに参加:私は多くの関係にリッチの多くを使用してい

  • をarticle_idにするとTAG_ID

    Article 
        has_many :tag_attachings 
        has_many :tags, :through => :tag_attachings 
    

    tag_attachingはのフィールドを持つテーブルを結合です(IDを持ってテーブルに参加)

私は、ユーザーがフォローしているタグを持つ記事を見つけるための効率的な方法を見つけようとしています。

ベストプラクティス?

答えて

1

を使用してください:を含めると、関連するテーブルから熱心に負荷レコードを読み込むので、大幅に手助けする必要があります。データを取得する

User 
    has_many :tag_followings 
    has_many :tags, :through => :tag_followings, :include => [:article] 

Article 
    has_many :tag_attachings 
    has_many :tags, :through => :tag_attachings, :include => [:user] 

はあなたの声明、次のようになります。に

User Load (0.3ms) SELECT users.* FROM users WHERE (users.id = 1) LIMIT 1 
Tag Load (1.2ms) SELECT tags.* FROM tags WHERE (users.tag_id =1) 
Article Load (3.2ms) SELECT articles.* FROM articles WHERE (articles.tag_id = 1) 
Article Load (3.2ms) SELECT articles.* FROM articles WHERE (articles.tag_id = 3) 
Article Load (3.2ms) SELECT articles.* FROM articles WHERE (articles.tag_id = 7) 

から行く必要がありますあなたのログ/ development.logから実行

User.find(1).tags.collect { |t| t.article.id } 

User Load (0.3ms) SELECT users.* FROM users WHERE (users.id = 1) LIMIT 1 
Tag Load (1.2ms) SELECT tags.* FROM tags WHERE (users.tag_id =1) 
Article Load (3.2ms) SELECT articles.* FROM articles WHERE (articles.tag_id IN (1,3,7)) 
+0

こんにちはポール。素晴らしいポートフォリオ!熱心な読み込みを紹介してくれてありがとう!私が走っているとき@articles = User.find(1).topics.map {| t | t.articles}出力は@articles = Article.find(all)を実行した場合と同じではありません。コンソール上で検査した結果、ソリューションの出力に[[##記事ID:1、user_id:2、タイトル: "テスト">]]とオリジナル: [#<記事id:1、user_id:2、title: "test">]をクリックします。あなたは私の部分が新しい変数をレンダリングできないので、どのように克服するか考えていますか?配列の未定義のメソッド 'model_name ':クラス – Sharethefun

+0

BTW、ポートフォリオの補足4. –

+0

どのようにあなたの部分であなたの出力を提示していますか? –

関連する問題