2010-12-31 2 views
0

내가이 User 2를 통해 테이블에 연결되는 모든 articles 얻을 필요가있는 상황에있어 : ​​레일스에서 ​​여러 개의 테이블 중에서 선택하십시오 - [table_1, table_2]까지 많은 "articles"이 있습니까?

  1. article_access은 : 공공의 기사 사용자 : 기사에게
  2. article_favorites를보고 사용자에게 권한을 부여 이

을 즐겨 찾기 한 그래서 액티브 당신이있을 수 있습니다 :

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 

그건 기본적으로 두 개의 별도 테이블에서 읽는 articles 연결을 제공합니다. 질문은 그래, 무엇 오른쪽 방법이 무엇입니까?

어떻게 든 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") 

요구는 문서에서는 두 테이블의 일부 또는 없음에있을 수 있기 때문에 왼쪽이 (조건 절 어획량에 가입 할 수 그것은 둘 다 존재하지 않는 경우).

article_favourites article_id/user_id 및 article_access_tokens article_id/user_id에 대한 고유 제한 조건이없는 경우 결과가 중복 될 수 있습니다.이 경우 데이터를 수정하고 대신 고유 제한 조건을 추가하는 것이 가장 좋습니다 뚜렷한 일을하는 것보다.

청결을 위해 has_many : authorized_articles 또는 user_id를 매개 변수로 사용하는 Article 모델의 범위가있을 수 있습니다.

관련 문제