Ruby on rails 您如何使用ActiveRecord从“created_at”开始按年份分组?
在SQL中,我会使用如下内容:Ruby on rails 您如何使用ActiveRecord从“created_at”开始按年份分组?,ruby-on-rails,ruby-on-rails-5,mysql2,Ruby On Rails,Ruby On Rails 5,Mysql2,在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-MariaD
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 log。你可以这样做来获得一系列独特的年份
Video.pluck(:created_at).map{ |dt| dt.year }.uniq
如果你只想从数据中获得年数,你可以这样做
videos = Video.group("created_at").select("videos.created_at")
它将只获取列中创建的_
您可以通过以下方式从列中的创建年访问
videos.first.created_at.year
您还可以执行以下操作:
Video.all.map {|u| u.created_at.year}
这将返回一个数组,其中包含每个视频创建的年份。不是所有内容都可以在activerecord speak中表达,而不会在这里或那里失去效率。或者有些东西根本无法表达。这就是为什么您可以运行任意SQL:
Video.connection.execute("select year(created_at)....")
在实际读取SQL之后,您希望记录的年份不同吗?那么,也许是这个?需要更快的基准测试
事实证明,Pulk接受表达式,而不仅仅是列名。因此,您可以以可移植性为代价实现最高效率
Video.distinct.pluck("year(created_at)") # mysql
Video.distinct.pluck("extract(year from created_at)") # postgresql
与从我的另一个答案中运行原始sql的效率相同,但看起来更为ActiveRecord-y
如果你想要一个可移植的解决方案,那么我想不出比它更好的了。我正在使用
Event.group("strftime('%Y', created_at)")
例如:
Event.group("strftime('%Y', created_at)").count
具有以下输出:
{"2019"=>456}
您甚至可以通过以下方式按孩子的“创建的”分组:
Application.group("strftime('%Y', events.created_at)")
这将要求,在我的特殊情况下,应用程序有许多事件。您的意思是只需要几年?Event.all.group_by{m|m.created_at.year}.keysWell,我现在觉得自己很笨。这很有效。这个查询会和我发布的SQL一样高效吗?@user3209270:不幸的是,不会,这是做这件事最慢、最浪费的方式之一。当然,我内心的偏执狂在敦促我在ActiveRecord中找到解决方案,以防DBMS因某种原因无法处理SQL。这将加载所有视频,总的来说,这比加载完整的视频要好,但这段代码仍然会实例化一些视频模型,这完全是在浪费cpu周期。
Application.group("strftime('%Y', events.created_at)")