查找使用acts_as_taggable_on标记的对象的所有子项

时间:2009-10-21 16:34:38

标签: ruby-on-rails activerecord acts-as-taggable

我有一个有两个模型的rails网站:事件和日期

活动有很多日期

使用acts_as_taggable_on

标记

事件

我正在尝试查找标记有特定标记的事件的所有日期(按时间顺序排列)。我可以弄清楚如何获取所有标记的事件,但我无法弄清楚如何获取所有日期。

我正在寻找的最终结果是创建一个类似事件的日历,其中每个日期都会出现事件。

希望这是有道理的,感谢任何和所有的输入!

1 个答案:

答案 0 :(得分:1)

如您所知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

然后,您可以在更有效的SQL查询中执行Date.for_tag("my_tag")并检索相同的列表。