아시다시피 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
.
감사합니다. 첫 번째 솔루션은 완벽하게 작동했습니다. 두 번째 문제는 (아마도 당신이 말한 것처럼 정확한 db 구조를 모르기 때문일 것입니다). 내 능력을 최대한 발휘하도록 조정했지만 '태그'에 대한 연결이 존재하지 않는다는 오류가 표시됩니다. 그것을 조금 들여다 보면, 날짜에 대한 태그 조합이 없기 때문에 코드의 조인 부분 때문에 발생하는 것처럼 보입니다. 어떤 아이디어? – Ryan
acts_as_taggable_on을 사용하지 않았으므로 암시 적으로 태그와 has_many 관계를 정의했다고 가정했지만 다른 이름을 가져야합니다. acts \ _as \ _taggable \ _on 소스를보고 참여할 테이블을 찾으십시오. 최후의 수단으로 볼 수는 있지만 관계 및 태그를 정의하는 모델 비트를 게시해야합니다. \ _many/belong \ _to/acts \ _as \ _taggable/acts \ _as \ _taggable \ _on이있는 행과 마찬가지로 – EmFi
이제는 관계 문제라는 것을 이해 했으므로 나중에 나중에 알아낼 수 있어야합니다. 지체와 모든 도움에 감사드립니다. 나는 같은 문제를 가진 다른 사람들을 위해 일할 때 여기에 올릴 것입니다. – Ryan