2009-05-28 4 views
1

내 응용 프로그램에서 사용자가 토론을 시작하고 토론에 참여할 수 있습니다. 그들은 또한 토론을 태그 할 수 있습니다. 그렇게 할 때 태그의 이름 (이미 존재하지 않은 경우)을 포함하는 태그가 생성되고, 어떤 사용자가 어떤 태그로 어떤 태그를 태그했는지 기억하는 태그가 만들어집니다.어려운 named_scope 상황

has_many :taggings 
has_many :tags, :through => :taggings 

내가 한 사용자에서 토론의 모든 태그를 검색 할 수있는 쉬운 방법을 만들려고 해요 :

그래서 토론 모델 내에서 우리는이 있습니다. 이상적으로, named_scopes는 사물을 좋고 깨끗하게 유지하는 데 현명하게 사용됩니다. 나는 다음과 비슷한 모습이 될 것입니다 생각 : 태그 클래스 안에이 named_scope 작성

tags = @discussion.tags.from_user(@user) 

매우 어려운 것으로 밝혀지고있다. 어떻게 생겼을 까? 나는 어떻게 든 그것을 꼬리표 테이블과 결합해야합니까?

답변

1

:

class Discussion < ActiveRecord::Base 
    has_many :taggings 
    has_many :tags, :through => :taggings 
end 

class Tagging < ActiveRecord::Base 
    belongs_to :discussion 
    belongs_to :tag 
end 

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :discussions, :through => :taggings 

    named_scope :by_user do 
    def named(user) do 
     Tagging.find_by_user_and_discussion(user, discussion).tags 
    end 
    end 
end 

이처럼 사용 어쩐지. 방법은 다음과 같습니다.

class Tag < AR::Base 
    named_scope :from_user, lambda { |user| 
    { :include => :taggings, :conditions => ["taggings.user_id = ?", user.id] } 
    } 
end 
0

어쩌면 이렇게 할 수 있습니다. 하지만하지 named_scope 솔루션 :

tags = @discussion.taggings.find_by_user(@user).map(&:tag) 

여기 taggings.find_by_user_id(@user.id)를 사용해야 할 경우 확실하지. 이 작업이 끝나면 지정된 사용자가 주어진 토론 내용에 태그를 포함하는 배열이 남습니다. 해당 배열을 taggings.tag-model에 매핑하십시오 (귀하의 태그 모델이 태그에 속한다고 생각합니다).

0

나는 이것을 테스트 할 기회가 없었지만, 나는 그것이 작동하지 않을 수 있습니다 생각 : 당신은 taggings 테이블로 가입해야 할

tags = @discussion.tags.by_user.named(@user)