ご存じのとおりEvents.tagged_with("my_tag")
、タグに一致するイベントのリストを返します。
次に、このリストで map または collect 演算子を使用して、各イベントの日付のリストを取得できます。
`map{|e| e.dates}`
これは、日付配列のリストを返します。各配列は、によって返されたリストのインデックス内のイベントに関連付けられた日付のリストです。Events.tagged_with("my_tag")
日付順に並べ替えるには、フラット化して並べ替える必要があります。
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}
日付の名前付きスコープを使用すると、これを簡素化できます。より高速なクエリになりますが、データベースの構造について詳しく知らなければ、クエリを作成することはできません。
日付がイベントに属していると仮定すると、次のようになります。
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
Date.for_tag("my_tag")
その後、はるかに効率的な SQL クエリで同じリストを実行して取得できます。