小编lak*_*kim的帖子

Rails:如何构建每天/每月/每年的统计信息或如何缺少与数据库无关的SQL函数(例如:STRFTIME,DATE_FORMAT,DATE_TRUNC)

我一直在网上搜索,我不知道.

  • 假设您必须在Rails应用程序的管理区域中构建一个仪表板,并且您希望每天拥有订阅数量.
  • 假设您使用SQLite3进行开发,使用MySQL进行生产(相当标准的设置)

基本上,有两种选择:

1)使用以下方法在Rails应用程序中使用和按天聚合从数据库中检索所有行:Subscriber.allEnumerable.group_by

@subscribers = Subscriber.all
@subscriptions_per_day = @subscribers.group_by { |s| s.created_at.beginning_of_day }
Run Code Online (Sandbox Code Playgroud)

我认为这是一个非常糟糕的主意.对于小型应用程序,从数据库中检索所有行是可以接受的,但它根本不会扩展.数据库聚合和日期功能拯救!

2)使用聚合和日期函数在数据库中运行SQL查询:

Subscriber.select('STRFTIME("%Y-%m-%d", created_at) AS day, COUNT(*) AS subscriptions').group('day')
Run Code Online (Sandbox Code Playgroud)

哪个将在此SQL查询中运行:

SELECT STRFTIME("%Y-%m-%d", created_at) AS day, COUNT(*) AS subscriptions
FROM subscribers
GROUP BY day
Run Code Online (Sandbox Code Playgroud)

好多了.现在聚合在数据库中完成,该数据库针对此类任务进行了优化,每天只有一行从数据库返回到Rails应用程序.

...但等等......现在应用程序必须在我使用MySQL的生产环境中运行!替换STRFTIME()DATE_FORMAT().如果明天我切换到PostgreSQL怎么办?替换DATE_FORMAT()DATE_TRUNC().

我喜欢用SQLite开发.简单易行.我也喜欢Rails与数据库无关的想法.但是为什么Rails没有提供一种方法来翻译完全相同的SQL函数,但是在每个RDBMS中都有不同的语法(这种差异真的很愚蠢,但是嘿,抱怨它为时已晚)?

我无法相信我在网上找到Rails应用程序的这一基本功能的答案很少:计算每天,每月或每年的订阅量.

告诉我我错过了什么:)

编辑

我发布这个问题已经有几年了.经验表明,我应该使用相同的数据库开发和生产.所以我现在认为数据库不可知的要求无关紧要.

开发/生产平价 FTW.

sql sqlite group-by ruby-on-rails count

19
推荐指数
3
解决办法
1万
查看次数

标签 统计

count ×1

group-by ×1

ruby-on-rails ×1

sql ×1

sqlite ×1