1

我有一个带有两个模型的 Rails 站点:事件和日期

事件有很多日期

使用acts_as_taggable_on 标记事件

我正在尝试查找带有特定标签的事件的所有日期(时间顺序)。我可以弄清楚如何获取所有标记的事件,但我不知道如何获取所有日期。

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

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

4

1 回答 1

1

如您所知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 查询中执行和检索相同的列表。

于 2009-10-21T20:32:36.093 回答