我已经在网上到处找了,但我一点头绪都没有。
假设您必须在Rails应用程序的管理区域中构建一个仪表板,并且您希望使用SQLite3 development、MySQL
获得每个app的订阅数量
基本上,有两种选择:
1) 使用Subscriber.all
从数据库中检索所有行,并使用Enumerable.group_by
在Rails应用程序中按天聚合:
@subscribers = Subscriber.all
@subscriptions_per_day = @subscribers.group_by { |s| s.created_at.beginning_of_day }
我认为这是一个非常糟糕的主意。从数据库中检索所有行对于小型应用程序来说是可以接受的,但它根本不会扩展。数据库聚合和日期函数来拯救!
2) 使用聚合和日期函数在数据库中运行SQL查询:
Subscriber.select('STRFTIME("%Y-%m-%d", created_at) AS day, COUNT(*) AS subscriptions').group('day')
它将在此SQL查询中运行:
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。
https://stackoverflow.com/questions/4028878
复制相似问题