gpt4 book ai didi

ruby-on-rails - 按父对象对评论进行分组,按最旧的评论对父对象进行排序

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:17 25 4
gpt4 key购买 nike

我有一些有评论的对象。作为定期电子邮件摘要的一部分,我想确定一段时间内的评论,并首先按照最旧的评论对象的顺序呈现对象。

数据:

object_id  comment_id
30 40
40 42
32 41
30 43
32 44

输出:

对象 #30

  • 评论 40
  • 评论 43

对象#40

  • 评论 42

对象 #32

  • 评论 41
  • 评论 44

我正在使用这段代码将数据获取到一个中间数组 - 我试图使用 .group_by(&:commentable_id) 一口气获取所有数据,但数据没有按正确的顺序出现。

comments = account.comments.all( 
:conditions => ["comments.created_at > ?", 8.hours.ago],
:order => "comments.created_at asc" ).map { |c| [c.commentable_id,c.id] }

=> [ [30,40], [40,42], [32,41], [30,43], [32,44] ]

如果我可以将该数据转换为以下形式,我可以遍历数组来构建电子邮件内容...

[ [30,[40,43]], [40,[42]], [32,[41,44]] ]

但我想知道我是否让这件事变得比我需要的更难......有什么建议吗?

(我正在使用 Rails 2.3 和 Ruby ree-1.8.7)

最佳答案

您可以使用带有数组聚合的组来获取您正在寻找的数组形式。

数组聚合在很大程度上依赖于数据库。 MySQL 的是 GROUP_CONCAT。 Postgres 的是 ARRAY_AGG。 Sqlite 没有开箱即用的功能,但我知道您可以定义自定义聚合函数,所以这并非不可能。

还没有实际尝试运行这段代码,但这里有一些东西应该能为您指明正确的方向:

result = Object.all(
:select => 'objects.id, GROUP_CONCAT(comment_id) AS comment_array',
:group => 'comments.id'
).map { |c| [c.id, c.comment_array] }

我使用了第一个示例中的命名,因此您需要将“对象”更改为您的表的任何名称。希望这是有道理的。 Rails 可能没有对解析数组的内置支持,因此它可能会为 comment_array 返回一个字符串,您可能必须解析它。

关于ruby-on-rails - 按父对象对评论进行分组,按最旧的评论对父对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2971465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com