簡體   English   中英

Rails has_many關聯計數子行

[英]Rails has_many association count child rows

什么是有效抓取父表的所有行的“軌道方式”以及每行的子節點數?

我不想使用counter_cache因為我想根據某些時間條件運行這些計數。

陳詞濫調的博客示例:文章表。 每篇文章都有0條或更多條評論。

我希望能夠提取每篇文章在過去一小時,一天,一周中有多少評論。

但是,理想情況下,我不想迭代列表並為每篇文章分別進行sql調用,也不想使用:include來預取所有數據並在應用服務器上處理它。

我想運行一個SQL語句並獲得一個包含所有信息的結果集。

我知道我可以硬編碼完整的SQL,也許可以使用.find並設置:joins:group:conditions參數......但我想知道是否有“更好”的方式...又名“鐵路方式”

提前致謝

這個activerecord調用應該做你想要的:

Article.find(:all, :select => 'articles.*, count(posts.id) as post_count',
             :joins => 'left outer join posts on posts.article_id = articles.id',
             :group => 'articles.id'
            )

這將返回一個文章對象列表,每個文章對象都有方法post_count ,其中包含文章中作為字符串的帖子數。

該方法執行類似於以下的sql:

SELECT articles.*, count(posts.id) AS post_count
FROM `articles`
LEFT OUTER JOIN posts ON posts.article_id = articles.id
GROUP BY articles.id

如果您很好奇,這是您在運行此類查詢時可能會看到的MySQL結果的示例:

+----+----------------+------------+
| id | text           | post_count |
+----+----------------+------------+
|  1 | TEXT TEXT TEXT |          1 |
|  2 | TEXT TEXT TEXT |          3 |
|  3 | TEXT TEXT TEXT |          0 |
+----+----------------+------------+

Rails 3版本

對於Rails 3,你會看到這樣的東西:

Article.select( "articles.*, count(comments.id) AS comments_count" )
  .joins( "LEFT OUTER JOIN comments ON comments.article_id = articles.id" )
  .group( "articles.id" )

感謝Gdeglin為Rails 2版本。

我用來解決這個問題的一個簡單方法是

在我的模型中,我做了:

class Article < ActiveRecord::Base
  has_many :posts

  def count_posts
    Post.where(:article_id => self.id).count
  end
end

現在,您可以使用例如:

Articles.first.count_posts

我不確定它是否可以更有效,但它是一個解決方案,在我看來比其他更優雅。

從SQL的角度來看,這看起來微不足道 - 只需編寫一個新查詢。

從Rails的角度來看,您提到的值是計算值。 因此,如果使用find_by_sql ,Model類將不知道計算字段,因此即使您設法將查詢轉換為Rails,也會將計算值返回為字符串。 請參閱下面的鏈接問題
一般的漂移(從我得到的問題的答案)是有一個單獨的類負責匯總/計算所需的值。

如何讓rails以正確的數據類型而不是字符串返回SUM(columnName)屬性?

我用這種方式做了這個工作:

def show
  section = Section.find(params[:id])
  students = Student.where( :section_id => section.id ).count
  render json: {status: 'SUCCESS', section: students},status: :ok
end

在這我有2個模型科和學生。 所以我必須計算匹配特定id部分的學生人數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM