首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails :如何构建每天/月/年的统计数据,或者数据库不可知的SQL函数是如何缺失的(例如,:STRFTIME、DATE_FORMAT、DATE_TRUNC)

Rails :如何构建每天/月/年的统计数据,或者数据库不可知的SQL函数是如何缺失的(例如,:STRFTIME、DATE_FORMAT、DATE_TRUNC)
EN

Stack Overflow用户
提问于 2010-10-27 07:35:49
回答 6查看 11.1K关注 0票数 20

我已经在网上到处找了,但我一点头绪都没有。

假设您必须在Rails应用程序的管理区域中构建一个仪表板,并且您希望使用SQLite3 developmentMySQL

  • production (相当标准的设置)

获得每个app的订阅数量

基本上,有两种选择:

1) 使用Subscriber.all从数据库中检索所有行,并使用Enumerable.group_by在Rails应用程序中按天聚合:

代码语言:javascript
运行
复制
@subscribers = Subscriber.all
@subscriptions_per_day = @subscribers.group_by { |s| s.created_at.beginning_of_day }

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

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

代码语言:javascript
运行
复制
Subscriber.select('STRFTIME("%Y-%m-%d", created_at) AS day, COUNT(*) AS subscriptions').group('day')

它将在此SQL查询中运行:

代码语言:javascript
运行
复制
SELECT STRFTIME("%Y-%m-%d", created_at) AS day, COUNT(*) AS subscriptions
FROM subscribers
GROUP BY day

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

..。等等..。现在,该应用程序必须在我使用MySQL的生产环境中上线!用DATE_FORMAT()替换STRFTIME()。如果明天我切换到PostgreSQL呢?用DATE_TRUNC()替换DATE_FORMAT()

我喜欢使用SQLite进行开发。简单和容易。我也喜欢Rails是数据库不可知的这个想法。但是,为什么Rails不提供一种方法来转换执行完全相同任务的函数,但是在每个关系型数据库管理系统中具有不同的语法(这种差异非常愚蠢,但是嘿,抱怨它已经太晚了)?

我真不敢相信,对于Rails应用程序的一个基本功能,我在网上找到的答案如此之少:计算每天、每月或每年的订阅量。

告诉我我漏掉了什么:)

编辑

自从我发布这个问题以来,已经有几年了。经验表明,我应该为dev和prod使用相同的DB。所以我现在认为数据库不可知的需求是无关紧要的。

Dev/prod parity FTW。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4028878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档