acts_as_taggable_onでタグ付けされたオブジェクトのすべての子を見つける
-
05-07-2019 - |
質問
イベントと日付の2つのモデルがあるRailsサイトがあります
イベントには多くの日付があります
イベントは、acts_as_taggable_onを使用してタグ付けされます
特定のタグでタグ付けされたイベントのすべての日付(時系列順)を検索しようとしています。すべてのタグ付きイベントを取得する方法はわかりますが、すべての日付を取得する方法はわかりません。
最終結果は、イベントがそれぞれの日付に表示される同様のイベントのカレンダーを作成することです。
うまくいけば、すべての入力に感謝します!
解決
ご存じのとおり、 Events.tagged_with(" my_tag")
は、タグに一致するイベントのリストを返します。
このリストでマップまたは収集演算子を使用して、各イベントの日付のリストを取得できます。
`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(&quot; my_tag&quot;)
を実行して、より効率的なSQLクエリで同じリストを取得できます。
所属していません StackOverflow