获取许多不同模型和关联之间的计数值

Getting a count value between many different models and associations

我一直想知道在几个不同的模型和关联之间获取计数值的最简单方法是什么。

我想在我看来有这样的东西

shop.receipts.articles.complaints.complaint_reviews.count

这是我的模型以及它们之间的关联:

class Shop < ActiveRecord::Base

has_many :receipts

end

class Receipt < ActiveRecord::Base

has_many :articles, dependent: :destroy
belongs_to :shop

accepts_nested_attributes_for :articles, allow_destroy:true, :reject_if => :all_blank

end

class Article < ActiveRecord::Base

belongs_to :receipt

has_one :complaint

end

class Complaint < ActiveRecord::Base

belongs_to :article
has_many :complaint_reviews

end

class ComplaintReview < ActiveRecord::Base

belongs_to :complaint

end 

我推断您想要与特定商店关联的所有 complaint_reviews 的计数。

在这种情况下,您需要以下内容:

shop = # get shop according to your criteria

ComplaintReview.
joins(complaint: {article: {receipt: :shop}}).
where(shops: {id: shop.id}).
count

我想您可以通过在收据的 shop_id 列应用条件来保存 shop 连接;像这样:

ComplaintReview.
joins(complaint: {article: :receipt}).
where(receipts: {shop_id: shop.id}).
count

如果所有收据都关联了商店,则两者的结果应该相同。但我会选择第一种方法。

这里要记住的是 'start' 使用您最终想要计数的模型。

此外,如果存在任何一对多关系,您会按 "complain_reviews.id" 对结果进行分组,然后执行计数。

好的,感谢上面的代码,我设法想出了一个可行的解决方案:

#shops_controller.rb:

def show

@count = ComplaintReview.
    joins(complaint: {article: {receipt: :shop}}).
    where(shops: {id: @shop.id}).
    count


respond_with(@shop)
end

#shops/show.html.erb:
<%= @count %>

非常感谢您的帮助。