2012-03-01 12 views
1

この特定の質問に対処するために何を検索すべきかについてはまだわかりません。 だからここに行く...ネストされたクエリのサブセット

私の現在の設計:

User < AR 
    has_many :items 
    has_many :projects 

Project < AR 
    has_many :groups 

Group < AR 
    has_many :items 

考える@project@userはどのように私はプロジェクト(@project.groups)のためのグループを取得しますが、これらのグループが与えられたためitemsだけ含まれている必要があります@ユーザー?

これは、コントローラーロジックではなくモデルで処理する必要があるようですが、これを実行するための最良のRailsの方法は何か分かりません。私は範囲とカスタムファインダーを調査しましたが、不必要に複雑に思えます。おそらく、それはモデル間の関係の欠陥です。

編集:おそらくこれは役に立ちますか?経由:

class User < ActiveRecord::Base 
    has_many :projects 
    has_many :groups, :through => :projects 
    has_many :items, :through => :groups 
end 

class Project < ActiveRecord::Base 
    has_many :groups 
end 

class Group < ActiveRecord::Base 
    has_many :items 
end 

次に、あなただけ呼び出すことができます。

@user.items 

を与えられたユーザのための項目のすべてを取得するために

User < AR 
    has_many :items 
    has_and_belongs_to_many :projects 

Project < AR 
    has_many :groups 
    has_and_belongs_to_many :users 

Group < AR 
    has_many :items 
+0

'Group'は複数のプロジェクトに属しますか?あなたの質問は、あなたのモデルデザインはそうではないことを意味します。 –

+0

プロジェクトの所有者または特定のユーザーのアイテムを含むすべてのグループを希望しますか? –

+0

@KandadaBogguグループは複数のプロジェクトに属することはできません。 – Stefan

答えて

0

私はあなたにhas_manyを探していると思います。

ネストされたhas_many:throughsはRails 3.1以降でのみ動作します。それ以外の場合は、おそらくメソッドを記述する必要があります!

+0

これは実際に私が今持っているものですが、私は、グループのコレクションを取得し、グループに通常含まれる可能性のあるすべてのアイテムではなく、特定のユーザーに関連付けられたアイテムのみを含むようにします。私は@ project.groupsを繰り返し処理し、各グループのアイテムのコレクションを再投入できると思いますが、より良い方法があるようです。 – Stefan

0

これは少し生のSQLを持っていますが、動作するはずです:

def Project 
    def groups_for_user u 
    self.groups.select("DISTINCT groups.*").join(:items).where("items.user_id = ?,u.id) 
    end 
end 

あなたは低いレベルitemsテーブルを結合しているので"DISTINCT groups.*"の理由は、結果で繰り返しを防ぐためです。

+0

今日はこれを試してみますが、うまくいくように見えます。私は.includeと.whereと近づいたが、何かが欠けていた。これは、私が見逃していたように見えます。指定されたユーザーのアイテムがなくても、これはグループになりますか? – Stefan

+0

join(:items)呼び出しがSQLにINNER JOINを作成するため、指定されたユーザーにアイテムがない場合は、グループを取得しません。 –

関連する問題