如何使用 ActiveRecord 按"created_at"开始的年份进行分组?



在SQL中,我会使用这样的东西:

SELECT year(created_at)
FROM videos
GROUP BY year(created_at)

如何使用Rails运行此查询?

我试过这个:

Video.all.group_by { |m| m.created_at.year }

但这将返回按相应年份分组的所有记录,这并不完全糟糕,只是它返回了数百条记录,而我只需要知道年份。

有指针吗?

如果你想知道我使用的是Rails 5.1.5和MariaDB(10.2.14-MariaDB-10.2.14+maria~xenial日志(。

你可以这样做来获得一个独特年份的数组。。。

Video.pluck(:created_at).map{ |dt| dt.year }.uniq
事实证明,pluck接受表达式,而不仅仅是列名。因此,您可以这样做以获得最大效率(以可移植性为代价(。
Video.distinct.pluck("year(created_at)") # mysql
Video.distinct.pluck("extract(year from created_at)") # postgresql

与运行原始sql的效率相同(根据我的另一个答案(,但看起来更像ActiveRecord-y。

如果你想要一个可移植的解决方案,那么我想不出比马克的答案更好的了。

并不是所有的东西都可以在activerecord speak中表达而不损失效率。或者有些事情根本无法表达。这就是为什么您可以运行任意SQL:

Video.connection.execute("select year(created_at)....")

在实际阅读了SQL之后,您想要不同年份的记录吗?那么,也许是这个?应该更快(需要基准测试(。

SELECT DISTINCT YEAR(created_at)  FROM videos

您还可以执行:

Video.all.map {|u| u.created_at.year}

这将返回一个数组,其中包含创建每个Video的年份。

我正在使用

Event.group("strftime('%Y', created_at)")

例如:

Event.group("strftime('%Y', created_at)").count

具有输出:

{"2019"=>456}

你甚至可以通过以下方式按孩子的created_at分组:

Application.group("strftime('%Y', events.created_at)")

在我的特定情况下,这将要求applications具有许多events

如果你只想从数据中提取几年,你可以进行

videos = Video.group("created_at").select("videos.created_at")

它将只获取created_at

您可以通过从created_at列访问年份

videos.first.created_at.year

相关内容

  • 没有找到相关文章

最新更新