代码之家  ›  专栏  ›  技术社区  ›  ohdeargod

两张表上有条件的活动记录计数

  •  1
  • ohdeargod  · 技术社区  · 15 年前

    看完后,最新的铁路公司与include和join信息,我知道我可以以一种更有效的方式做我正在做的事情。我有一个非常简单的用户模型和一个状态模型。用户属于状态,状态有多个用户。我需要计算有多少用户具有特定类型的状态,这将为每个状态创建一个新的SQL计数查询,我知道这不是一个很好的方法。现在看起来像这样。

    statuses = Status.all
    
    statuses.each do |status|
      status.users.count
    end
    

    最后我提出了4个问题:

    SELECT count(*) AS count_all FROM "users" WHERE ("users".status_id = 1)
    SELECT count(*) AS count_all FROM "users" WHERE ("users".status_id = 2)
    

    对于数据库中存在的许多不同的状态,它都是这样进行的。最大的问题是,现在我还需要通过另一个关联(即组织)进行过滤。因此,我需要查找在某个组织中具有特定状态的所有用户的计数。这最终使我提出的查询量增加了两倍,感觉很糟糕。我不知道我可以用什么样的连接来减少这个,或者我可以做什么来修复这个。感谢您的帮助:)

    3 回复  |  直到 15 年前
        1
  •  2
  •   ohdeargod    15 年前

    好吧,所以我要回答我自己的问题,以防万一有人有同样的问题。

    Status.all(:joins => :users,
               :select => "statuses.*, count(users.id) as users_count",
               :group => "statuses.id")
    

    这将返回具有用户的每个状态以及用户计数作为用户计数。为了进一步优化查询并只计算属于某个组织的用户,查询将更改为该组织。

    Status.all(:joins => :users,
               :select => "statuses.*, count(users.id) as users_count",
               :conditions => {:users => {:organization_id => ORG_ID_HERE}},
               :group => "statuses.id")
    

    我希望这能帮助任何有同样问题的人,感谢艾曼塔和瑞安·贝茨(Railcasts)。

        2
  •  1
  •   Eimantas    15 年前

    您可以尝试纯SQL:

    SELECT s.name,COUNT(u.id) AS users_count FROM statuses s, users u WHERE s.id=u.status_id GROUP BY s.id;

        3
  •  0
  •   fractious    15 年前

    出于兴趣,您的状态模型包含什么?它真的需要成为自己的模式吗?我在这里猜,但你可能想考虑实施 finite state machine . 有许多Rails插件使实现FSM变得容易,例如 acts_as_state_machine