【问题标题】:rails: count and group with joined tablesrails:使用连接表进行计数和分组
【发布时间】:2013-07-31 22:21:22
【问题描述】:

我有以下型号:

Car: 
has_many :car_classes  

CarClass:
belongs_to :Car
belongs_to :CarMainClass

CarMainClass:
has_many :car_classes

我想要做的是计算 CarClass 中按 car_main_class_id 分组的汽车数量,然后链接到 CarMainClass 中的 main_class_symbol。

我现在的查询是:

CarClass.group(:car_main_class_id).count(:car_id) => {43=>79, 45=>4 ...}

这几乎是我想要的,除了我最终只得到 :car_main_class_id ,我将成为 CarMainClass 的 :main_class_symbol:

{"A1"=>79, "A2"=>4 ...}

我尝试加入表格和自定义选择选项,但它们不起作用。

这可以在我不必再次遍历主类的查询中完成吗?

非常感谢您的帮助!

【问题讨论】:

  • 您的型号名称不好。 CarMainClass 是否可以更好地命名为 CarCompany(或类似名称)?
  • 嘿汤姆,我知道哈哈,谢谢你的建议。我实际上在这个问题中重命名了它们以使它们更通用。

标签: ruby-on-rails activerecord arel


【解决方案1】:

您应该查看 Rails ActiveRecords 的一个非常简单的功能:counter_cache 列,而不是使用 SQL 方法和使用“计数/分组依据”。

例如,您可以在 CarMainClass 中添加一列“car_classes_count”,在 CarClass 类中,您可以这样做:

CarClass:
belongs_to :car
belongs_to :car_main_class, :counter_cache => true

您可以对 Car 中的“car_class_count”列执行相同操作。

我不知道它是否有帮助,但是当我开始使用 Rails 进行开发时,我遇到了同样的问题。我尝试做一些不成功的疯狂 SQL 查询(使用 sqlite 的查询,但没有使用 postgres 的查询),我最终选择了另一种方法。

【讨论】:

  • 谢谢伙计。我确实刚开始使用 rails,我不知道我可以将它用于此目的!
【解决方案2】:

试试这个:

CarClass.includes(:car_main_class => :car_classes)
 .group(:car_main_class_id).map { |cc| 
   { cc.car_main_class.main_class_symbol => cc.car_main_class.cars.size }
 }

虽然这很丑 - 我同意 @Tom 的观点,您应该尝试考虑更有意义的类名。

【讨论】:

  • 谢谢蒂洛!这会奏效!我现在意识到,没有任何查询可以不遍历结果。柜台兑现似乎是一个不错的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
相关资源
最近更新 更多