在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