2009-10-21 2 views
1

acts_as_taggable_on 태그 객체의 모든 자식 찾습니다나는 두 가지 모델과 함께 레일 사이트가

이벤트를 이벤트와 날짜은 많은 날짜

있다

이벤트는 내가하려고 해요

acts_as_taggable_on 사용하여 태그 특정 태그로 태그가 지정된 이벤트의 모든 날짜 (시간 순서)를 찾습니다. 태그가 지정된 모든 이벤트를 가져 오는 방법을 알아낼 수는 있지만 모든 날짜를 가져 오는 방법을 알 수는 없습니다.

내가 찾고있는 최종 결과는 이벤트가 각각의 날짜에 나타나는 유사한 이벤트의 캘린더를 만드는 것입니다.

모든 입력에 감사드립니다.

답변

1

아시다시피 Events.tagged_with("my_tag")은 태그와 일치하는 이벤트 목록을 반환합니다.

이 목록에서지도 또는 수집 연산자를 사용하여 각 이벤트의 날짜 목록을 얻을 수 있습니다. Events.tagged_with("my_tag")

에 의해 반환 된 목록의 인덱스에 이벤트와 연관된 날짜 목록이 날짜를 기준으로 주문하려면 각 배열은 당신이 평평하고 분류 할 필요가

`map{|e| e.dates}` 

이 날짜 배열의 목록을 반환합니다.

flatten.sort{|a,b| a.created_at <=> b.created_at} 

전체 메서드 호출을 만들기 :

Events.tagged_with("my_tag").map{|e| e.dates}.flatten.sort{|a,b| a.created_at <=> b.created_at} 

당신은 날짜에 명명 된 범위와 함께이 문제를 단순화 할 수 있습니다. 더 빠른 쿼리가 될 것이지만, 데이터베이스의 구조에 대해 더 많이 알지 못해도 쓸 수는 없습니다.

그것은 날짜가 이벤트에 속하는 가정, 다음과 같이 보일 것이다 : 그러면 훨씬 더 효율적인 SQL 쿼리, 동일한 목록을 Date.for_tag("my_tag")을하고 검색 할 수

class Date < ActiveRecord::Base 
    ... 
    named_scope :for_tag, lambda do |tag| 
    {:joins => [:tags, :taggings], 
    :conditions => ["tags.name = ? AND tags.id = taggings.tag_id \ 
     AND taggings.taggable_id = dates.event_id AND \ 
     taggings.taggable_type = event", tag], 
    :order => 'dates.created_at'} 
    end 
end 

.

+0

감사합니다. 첫 번째 솔루션은 완벽하게 작동했습니다. 두 번째 문제는 (아마도 당신이 말한 것처럼 정확한 db 구조를 모르기 때문일 것입니다). 내 능력을 최대한 발휘하도록 조정했지만 '태그'에 대한 연결이 존재하지 않는다는 오류가 표시됩니다. 그것을 조금 들여다 보면, 날짜에 대한 태그 조합이 없기 때문에 코드의 조인 부분 때문에 발생하는 것처럼 보입니다. 어떤 아이디어? – Ryan

+0

acts_as_taggable_on을 사용하지 않았으므로 암시 적으로 태그와 has_many 관계를 정의했다고 가정했지만 다른 이름을 가져야합니다. acts \ _as \ _taggable \ _on 소스를보고 참여할 테이블을 찾으십시오. 최후의 수단으로 볼 수는 있지만 관계 및 태그를 정의하는 모델 비트를 게시해야합니다. \ _many/belong \ _to/acts \ _as \ _taggable/acts \ _as \ _taggable \ _on이있는 행과 마찬가지로 – EmFi

+0

이제는 관계 문제라는 것을 이해 했으므로 나중에 나중에 알아낼 수 있어야합니다. 지체와 모든 도움에 감사드립니다. 나는 같은 문제를 가진 다른 사람들을 위해 일할 때 여기에 올릴 것입니다. – Ryan