[英]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,你會看到這樣的東西:
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,也會將計算值返回為字符串。 請參閱下面的鏈接問題
一般的漂移(從我得到的問題的答案)是有一個單獨的類負責匯總/計算所需的值。
我用這種方式做了這個工作:
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.