2011-11-18 5 views
1

のは2つの異なる団体を通じて、すべてのアイテムを取得

  • ユーザーが持っている。また、多くのプロジェクト(ユーザーが作成したプロジェクト)
  • ユーザーは多くのメンバーシップ

を持って

  • ユーザーを持っているとしましょうメンバーシップを通じた多数のjoined_projects(他のユーザーが作成したプロジェクト)

'projects'と 'joined_projects'に参加して、sqlを使わずにユーザーがうまくアクセスできるすべてのプロジェクトを取得する最良の方法は何ですか?

他のオプションは、ユーザーがプロジェクトを所有していてもすべてのプロジェクトのメンバーシップを作成することですが、データベース上で重複したデータを生成します。

答えて

1

ActiveRelationのメソッドは常に内部結合を使用するため、SQLの観点からはこれを「正しく」行う方法はありません。しかし、あなたは常にcounter_cacheを設定し、そのようにそれを照会することができます

class User < ActiveRecord::Base 
    has_many :projects, :counter_cache => true 
    has_many :joined_projects, :through => :memberships, :counter_cache => true 

    class << self 
    def has_projects 
     where('projects_count > 0 OR joined_projects_count > 0') 
    end 
    end 

    def all_projects 
    projects + joined_projects 
    end 
end 

これは、正規の神経を打つかもしれないが、仕事を得る必要があります。

関連する問題