Ruby on rails 查找标记有acts_as_taggable_on的对象的所有子对象

Ruby on rails 查找标记有acts_as_taggable_on的对象的所有子对象,ruby-on-rails,activerecord,acts-as-taggable,Ruby On Rails,Activerecord,Acts As Taggable,我有一个rails站点,它有两个模型:事件和日期 事件有很多日期 使用acts_as_taggable_on标记事件 我正在尝试查找带有特定标记的事件的所有日期(按时间顺序)。我知道如何获取所有标记的事件,但我不知道如何获取所有的日期 我要寻找的最终结果是创建一个类似事件的日历,其中事件会出现在每个日期上 希望这是有意义的,谢谢所有的意见 如您所知事件。使用(“我的标签”)标记事件。返回与标记匹配的事件列表 然后,您可以使用此列表上的map或collect操作符获取每个事件的日期列表 `map{

我有一个rails站点,它有两个模型:事件和日期

事件有很多日期

使用acts_as_taggable_on标记事件

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

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


希望这是有意义的,谢谢所有的意见

如您所知
事件。使用(“我的标签”)标记事件。
返回与标记匹配的事件列表

然后,您可以使用此列表上的map或collect操作符获取每个事件的日期列表

`map{|e| e.dates}`
这将返回一个日期数组列表,其中每个数组都包含由
事件返回的列表索引中与事件相关联的日期列表。标记为(“我的标签”)

要按日期排序,您需要进行展平和排序

flatten.sort{|a,b| a.created_at <=> b.created_at}
flatte.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}
Events.taged_with(“my_tag”).map{e|e.dates}.flatte.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
课程日期[:tags,:taggings],
:conditions=>[“tags.name=?和tags.id=taggings.tag\u id\
和taggings.taggable_id=dates.event_id和\
taggings.taggable_type=event“,tag],
:order=>dates.created_在'}
结束
结束

然后,您可以执行
Date.for_标记(“my_标记”)
并在更高效的SQL查询中检索相同的列表。

如您所知
Events.taged_with(“my_标记”)
返回与标记匹配的事件列表

然后,您可以使用此列表上的map或collect操作符获取每个事件的日期列表

`map{|e| e.dates}`
这将返回一个日期数组列表,其中每个数组都包含由
事件返回的列表索引中与事件相关联的日期列表。标记为(“我的标签”)

要按日期排序,您需要进行展平和排序

flatten.sort{|a,b| a.created_at <=> b.created_at}
flatte.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}
Events.taged_with(“my_tag”).map{e|e.dates}.flatte.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
课程日期[:tags,:taggings],
:conditions=>[“tags.name=?和tags.id=taggings.tag\u id\
和taggings.taggable_id=dates.event_id和\
taggings.taggable_type=event“,tag],
:order=>dates.created_在'}
结束
结束

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

谢谢,第一个解决方案非常有效。第二个我遇到了麻烦(可能是因为你不知道确切的db结构,就像你说的那样)。我已经尽我所能调整了它,但是我得到一个错误,说“标签”的关联不存在。仔细研究之后,它看起来像是由代码的:joins部分引起的,因为没有日期的标记关联。有什么想法吗?我没有使用acts_as_taggable_,所以我假设它隐式定义了一个与标记有很多关系的对象,它必须有另一个名称。查看源上的acts_as_taggable_以确定要连接哪些表。作为最后的手段,我可以查看它,但是您需要发布您的模型中定义关系和标记的部分。因为只有has_many/belish_to/acts_As_taggable/acts_As_taggable_onNow我理解这是一个关系问题,我今天晚些时候应该能够解决它。很抱歉耽搁了,谢谢你的帮助。当我为其他可能有相同问题的人完成后,我会在这里发布。不要担心延迟。这并不是说任何人真的需要声誉。我在这里提出了一个解决方案,允许我们返回ActiveRecord:关系:谢谢,第一个解决方案工作得很好。第二个我遇到了麻烦(可能是因为你不知道确切的db结构,就像你说的那样)。我已经尽我所能调整了它,但是我得到一个错误,说“标签”的关联不存在。仔细研究之后,它看起来像是由代码的:joins部分引起的,因为没有日期的标记关联。有什么想法吗?我没有使用acts_as_taggable_,所以我假设它隐式定义了一个与标记有很多关系的对象,它必须有另一个名称。查看源上的acts_as_taggable_以确定要连接哪些表。作为最后的手段,我可以查看它,但是您需要发布您的模型中定义关系和标记的部分。因为只有has_many/belish_to/acts_As_taggable/acts_As_taggable_onNow我理解这是一个关系问题,我今天晚些时候应该能够解决它。很抱歉耽搁了,谢谢你的帮助。当我为其他可能有相同问题的人完成后,我会在这里发布。不要担心延迟。并不是每个人都真正需要声誉。我在这里提出了一个解决方案,允许我们返回ActiveRecord:Relation: