Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 您如何使用ActiveRecord从“created_at”开始按年份分组?_Ruby On Rails_Ruby On Rails 5_Mysql2 - Fatal编程技术网

Ruby on rails 您如何使用ActiveRecord从“created_at”开始按年份分组?

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

在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 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)")