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

时间:2015-01-18 15:37:58

标签: ruby-on-rails-4 activerecord 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 

2 个答案:

答案 0 :(得分:1)

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

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

shop = # get shop according to your criteria

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

我认为您可以通过在shop收据列上应用条件来保存shop_id联接;像这样:

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

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

这里要记住的是开始&#39;与您最终想要计数的模型。

此外,如果存在任何一对多关系,您可以将结果分组为&#34; complain_reviews.id&#34;然后进行了计数。

答案 1 :(得分:0)

好的,感谢上面的代码,我设法提出了一个有效的解决方案:

#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 %>

非常感谢你的帮助。