2010-12-31 8 views
0

私はUser 2経由のテーブルに関連付けられているすべてのarticles取得する必要がある状況にいるよ:Railsの複数のテーブルから選択する - [table_1、table_2]までに多数の「記事」がありますか?

  1. article_accessは:公共の記事の、ユーザ:記事に
  2. article_favoritesを見るためにユーザーに権限を与えますこれら

をお気に入りに追加しているので、ActiveRecordの中で、あなたはこれを持っているかもしれません:

class User < ActiveRecord::Base 
    has_many :article_access_tokens 
    has_many :article_favorites 

    def articles 
    unless @articles 
     ids  = article_access_tokens.all(:select => "article_id").map(&:article_id) + article_favorites.all(:select => "article_id").map(&:article_id) 
     @articles = Article.send(:scoped, :conditions => {:id => ids.uniq}) 
    end 

    @articles 
    end 
end 

それは私に基本的に2つの別のテーブルから読み取るarticlesアソシエーションを与えます。しかし、質問はありますか?これを行う方法は?

これを行うには何とか1 SQL SELECT呼び出しを行うことはできますか?

答えて

1

うん、あなたはこれを行うに合流書くことができ、何かのように:

Article.all(:joins => "left join article_access_tokens on (article_access_tokens.article_id = articles.id and article_access_tokens.user_id = #{self.id}) 
         left join article_favourites on (article_favourites.article_id = articles.id and article_favourites.user_id = #{self.id})", 
      :conditions => "article_favourites.id is not null or article_access_tokens.id is not null") 

ニーズが記事2つのテーブルのいずれか、またはいずれにも可能性があるため、左は(条件句キャッチに参加することがそれがどちらにもない場合)。

これは、article_favourites article_id/user_idとarticle_access_tokens article_id/user_idに固有の制約がない場合、結果が重複する可能性があります。その場合は、データを修正してユニークな制約を追加するのが最適です独特のことをするよりも。 authorized_articlesやパラメータなどのuser_idをとりArticleモデルのスコープ:

は清潔さのために、あなたはおそらくにhas_manyを持つことができます。

関連する問題