-->

找到标有acts_as_taggable_on对象的所有儿童(find all children o

2019-08-31 06:35发布

我有一个导轨与现场两种模式:事件和日期

事件有很多日期

事件是使用acts_as_taggable_on标记为

我试图找到标有特定标签事件的所有时间(按时间顺序)。 我能弄清楚如何让所有的标的事件,但我无法弄清楚如何让所有的日期。

最终的结果我要找的是要创造一个事件上他们的每一个日期出现类似事件的日历。

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

Answer 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

那么你可以做Date.for_tag("my_tag")并获得相同的列表,在一个更有效的SQL查询。



文章来源: find all children of an object tagged with acts_as_taggable_on