Ruby on rails 使用nested has\u many获取记录计数

Ruby on rails 使用nested has\u many获取记录计数,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有一个id为1的记录a,它有许多B记录,每个记录都有许多C A(id=1)=>[b个记录]=>[[C个记录对应于每个b]] 我需要得到给定A的C计数 我很确定这与加入、组、或订单`有关,但我不知道确切的原因。我需要一种在固定时间SQL操作中实现这一点的方法。没有迭代查询 类似于: A.join(:b=>:c).其中(id:1).计数(“c.id”) 如果您已经有一个A的实例: a.b.joins(:c).count(“c.id”)类似于: A.join(:b=>:c).其中(id:1).计数(

我有一个id为1的记录a,它有许多B记录,每个记录都有许多C

A(id=1)=>[b个记录]=>[[C个记录对应于每个b]]

我需要得到给定A的C计数

我很确定这与
加入
、组、或订单`有关,但我不知道确切的原因。我需要一种在固定时间SQL操作中实现这一点的方法。没有迭代查询

类似于:

A.join(:b=>:c).其中(id:1).计数(“c.id”)

如果您已经有一个
A
的实例:

a.b.joins(:c).count(“c.id”)

类似于:

A.join(:b=>:c).其中(id:1).计数(“c.id”)

如果您已经有一个
A
的实例:

a.b.连接(:c).计数(“c.id”)
使用a:

如果has many through
a.cs
关联是您不会经常使用的,并且您不希望将其添加到您的模型中,那么您可以使用
merge

C.joins(:b).merge(a.bs).count
使用:

如果has many through
a.cs
关联是您不会经常使用的,并且您不希望将其添加到您的模型中,那么您可以使用
merge

C.joins(:b).merge(a.bs).count
两条路

C.joins(:b).where(:bs => {:a_id => a.id}).count

两条路

C.joins(:b).where(:bs => {:a_id => a.id}).count


假设我有理由不通过bs为cs创建has MULTY THORY关联,我会这样做:

class A < ActiveRecord::Base
  has_many :bs
  # has_many :cs, through: :bs - this allows a.cs.size as has been noted here
end

class B < ActiveRecord::Base
  has_many :cs
  belongs_to :a
end

class C < ActiveRecord::Base
  belongs_to :b
end


# you can always do this if you don't want to create the above association through bs:
a.bs.flat_map(&:cs).size
class A
假设我有理由不通过bs为cs创建has MULTY THORY关联,我会这样做:

class A < ActiveRecord::Base
  has_many :bs
  # has_many :cs, through: :bs - this allows a.cs.size as has been noted here
end

class B < ActiveRecord::Base
  has_many :cs
  belongs_to :a
end

class C < ActiveRecord::Base
  belongs_to :b
end


# you can always do this if you don't want to create the above association through bs:
a.bs.flat_map(&:cs).size
class A
您可以添加一些模型名称示例吗?您可以添加一些模型名称示例吗?虽然所有三个答案都给出了不同的工作解决方案,但这一个对我来说似乎最清楚。实际上,这两个解决方案都需要修复。我甚至不认为第二种解决方案是可能的(a上没有
b
方法)。@Swards如果
a
有很多:b
那么
a上有
b
方法
a
上可能有一个
属于:b
而a
有很多:b
(复数)为了区分集合和实例虽然所有三个答案都给出了不同的工作解决方案,但这一个对我来说似乎最清楚。实际上,这两个解决方案都需要修复。我甚至不认为第二种解决方案是可能的(a上没有
b
方法)。@Swards如果
a
有很多:b
那么
a上有
b
方法
a
上可能有一个
属于:b
而a
有很多:b
(复数)为了区分集合和实例,请解释您试图实现的目标。有问题吗?没有问题,只是从不同的角度回答了原来的问题。试图通过Bs实现A的Cs计数。平面图是一种不同的结束方式。对不起,Jasonbuehler,我昨晚在管理问题,我没有意识到我进入了回答管理队列,我在评论,好像是用户的第一篇帖子。再次抱歉。请解释一下你想要达到的目标。有问题吗?没有问题,只是从不同的角度回答了原来的问题。试图通过Bs实现A的Cs计数。平面图是一种不同的结束方式。对不起,Jasonbuehler,我昨晚在管理问题,我没有意识到我进入了回答管理队列,我在评论,好像是用户的第一篇帖子。再次抱歉。
class A < ActiveRecord::Base
  has_many :bs
  # has_many :cs, through: :bs - this allows a.cs.size as has been noted here
end

class B < ActiveRecord::Base
  has_many :cs
  belongs_to :a
end

class C < ActiveRecord::Base
  belongs_to :b
end


# you can always do this if you don't want to create the above association through bs:
a.bs.flat_map(&:cs).size