我一直在网上搜索,我不知道.
基本上,有两种选择:
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.