2010-11-19 1 views
4
User 
has_many :posts 
has_many :post_tags, :through => :posts 

PostTag 
belong_to :post 
belongs_to :tag 
scope :distincttag, :select => ('distinct post_tags.tag_id') 

생산을 통해, 내가 잘못된 SQL을 얻을 : SELECT post_tags을 *, 별개의 tag_id ...레일 - 사용 : (별개의) 선택과 : has_many는 : 협회 레일 3.0.4와 유효하지 않은 SQL

에서. 다른 사람이 같은 문제를 경험 한 사람 : http://www.ruby-forum.com/topic/484938

기능 또는 버그?

감사합니다.

+0

OK, 결코 마음, 그것은 작업을 수행

은 아마 당신은 이러한 목표를 달성하기 위해 노력하고있다 . 즉, PostTag에서 범위를 만드는 것이 효과적입니다. 그러나 작동하지 않는 것은 ".select"를 연결하는 것입니다. someuser.post_tags.select ('distinct tag_id')는 위의 오류가 발생합니다. 조인/연결에서 암시 적으로 선택을 "선택"해서는 안됩니까? – avioing

+0

'@ user.post_tags.uniq.pluck (: tag_id)'당신이 원하는 것을 얻을 수도 있습니다 – bdares

답변

3

범위에 넣는 것이 옳지 않은 것처럼 보입니다.

class PostTag < ... 
    belong_to :post 
    belongs_to :tag 
    def distincttag 
    find(:all, :select => 'distinct tag_id') 
    end 
end 

편집 : 지금은 당신이 필요로하는 것을 알고 :

User 
has_many :posts 
has_many :post_tags, :through => :posts, :select => 'distinct tags.*' 
# or, if you are not worried about database overhead: 
has_many :post_tags, :through => :posts, :uniq => true 

참조 : http://blog.hasmanythrough.com/2006/5/6/through-gets-uniq

+0

미안하지만, 나는 아주 분명하다고 생각하지 않습니다. 목표는 사용자의 고유 한 태그 목록을 얻는 것입니다. PostTag에 메소드를 추가하면 someuser.post_tags.distincttag - post_tags가 배열이기 때문에 오류가 발생합니다. – avioing

+0

이제 알겠습니다 ... 내 대답을 편집했습니다. –

+0

Fabio, 고마워,하지만 불행히도 그건 효과가 없을거야. 처음 편집 한 예제는 ": select => 'distinct tags. *'를 사용하고 있지만,"tags. * "테이블은 조인의 일부조차도 아닙니다."uniq "를 사용하는 두 번째 예제는 작동하지 않습니다. "post_tags"레코드 (post_id, tag_id)에서 "uniq"를 사용하는 반면 고유 한 "post_tags"가 아닌 고유 한 "태그"(tag_id)를 원합니다. – avioing