【问题标题】:What's the most efficient way to display a count of objects depending on their enum value in rails?根据rails中的枚举值显示对象计数的最有效方法是什么?
【发布时间】:2016-01-01 10:08:26
【问题描述】:

我正忙着清理我的代码,以便通过一些急切的加载使其更高效,我注意到我的代码在显示基于枚举值的对象计数时肯定是缓慢的。在我的代码中,我有:

Class SalesOpportunity < ActiveRecord::Base
 default_scope { order('close_date ASC') }
 belongs_to :user
 belongs_to :company
 enum pipeline_status: [ :prospect, :qualifying, :demonstrating, :negotiating, :closed_won, :closed_lost, :dormant ]
end

在我看来,我正在向用户展示销售过程中每个阶段的销售机会计数 - 在用户视图 (show.html.erb) 中使用以下内容:

@user.sales_opportunities.where(pipeline_status: 0).count
@user.sales_opportunities.where(pipeline_status: 1).count
... etc

我在销售流程的每个阶段都执行此操作,因此每次显示视图时都会将 7 个不同的 SQL 查询发送到数据库。我确信有一种方法可以将它抽象到控制器或模型本身,但我正在努力想出它。谁能推荐一种可以提高我性能的方法?

【问题讨论】:

    标签: ruby-on-rails enums


    【解决方案1】:

    pipeline_status分组。

    @user.sales_opportunities.group(:pipeline_status).count
    

    这会生成类似这样的 SQL:

    SELECT pipeline_status,count(*) FROM
    sales_opportunities WHERE sales_opportunities.user_id = $user_id
    GROUP BY pipeline_status
    

    然后您可以迭代结果并显示计数。

    【讨论】:

    • 谢谢。我尝试在控制台中使用它,但出现以下错误:PG::Error: ERROR: column "sales_opportunities.close_date" must appear in the GROUP BY clause or be used in an aggregate function - 知道为什么吗?
    • user.sales_opportunities.group(:pipeline_status).count - 我已经从数据库中选择了一个用户(称之为“用户”)。
    • 生成的SQL是什么?
    • : SELECT COUNT(*) AS count_all, pipeline_status AS pipeline_status FROM "sales_opportunities" WHERE "sales_opportunities"."user_id" = $1 GROUP BY pipeline_status ORDER BY close_date ASC ActiveRecord::StatementInvalid: PG::Error: ERROR: column "sales_opportunities.close_date" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: ..."user_id" = $1 GROUP BY pipeline_status ORDER BY close_date...
    • 解决了——我用user.sales_opportunities.unscope(:order).group(:pipeline_status).count ——现在我只需要弄清楚如何使用输出!谢谢!
    猜你喜欢
    • 2011-09-05
    • 1970-01-01
    • 2022-01-13
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多