我有一个带有两个模型的 Rails 站点:事件和日期
事件有很多日期
使用acts_as_taggable_on 标记事件
我正在尝试查找带有特定标签的事件的所有日期(时间顺序)。我可以弄清楚如何获取所有标记的事件,但我不知道如何获取所有日期。
我正在寻找的最终结果是创建一个类似事件的日历,其中事件出现在每个日期。
希望这是有道理的,感谢您的任何和所有输入!
我有一个带有两个模型的 Rails 站点:事件和日期
事件有很多日期
使用acts_as_taggable_on 标记事件
我正在尝试查找带有特定标签的事件的所有日期(时间顺序)。我可以弄清楚如何获取所有标记的事件,但我不知道如何获取所有日期。
我正在寻找的最终结果是创建一个类似事件的日历,其中事件出现在每个日期。
希望这是有道理的,感谢您的任何和所有输入!
如您所知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 查询中执行和检索相同的列表。