2011-09-03 74 views
0

什麼是以下等效的鋼軌聲明?ruby​​ on rails:什麼是find_by_sql的等價語句?

@temp = Post.find_by_sql("SELECT posts.id,posts.title, comment_count.count FROM posts INNER JOIN (SELECT post_id, COUNT(*) AS count FROM comments GROUP BY post_id) AS comment_count ON comment_count.post_id = posts.id ORDER BY count DESC LIMIT 5;") 

是否可以將它轉換爲find/where/select語句?

這是一個複雜的查詢,我不能得到它,但嘗試過這樣的事情,

@temp = Post.select("posts.id, posts.title, comment_count.count").joins(:comments).group("post_id").order("countpages.counts desc").limit(5) 
+1

你要問每個查詢你有這個問題?請先嚐試弄清楚自己,然後如果你無法弄清楚,告訴我們你嘗試了什麼,有人會幫助你。 – Mischa

+0

這是一個複雜的查詢,我無法得到它,但嘗試了這樣的事情,@temp = Post.select(「posts.id,posts.title,comment_count.count」)。joins(:comments).group(「 (5) – shibly

+0

這不是一個壞問題... +1 :) – Nayish

回答

1

使用類似Arel甚至可能進一步清理這件事,我的意思,開始使用它我下一個應用程序(還沒有)。

@temp = Post.find_by_sql("SELECT posts.id,posts.title, comment_count.count FROM posts INNER JOIN (SELECT post_id, COUNT(*) AS count FROM comments GROUP BY post_id) AS comment_count ON comment_count.post_id = posts.id ORDER BY count DESC LIMIT 5;")

可能是(只有一點點清潔,但可以讓你至少連鎖範圍):

@temp = Post.joins("JOIN (SELECT post_id, COUNT(*) AS count FROM comments GROUP BY post_id) AS comment_count ON comment_count.post_id = posts.id").order("count desc").limit(5)

我敢肯定Arel會讓你做一個子選擇通過示波器稍微優雅些,但我不太熟悉它給你一個解決方案。

編輯

您可以只需添加一個counter_cachecomments協會您Post模型,以避免每次計算。從here

class Post < ActiveRecord::Base 
    has_many :comments, :counter_cache => true 
end 

文檔:counter_cache

緩存通過 屬於對關聯類對象使用increment_counter和decrement_counter的數量。計數器緩存 在創建此類的對象時遞增,並在銷燬時遞減 。這要求在關聯類(例如Post類)上使用名爲 #{table_name} _count的列(例如對於所屬類別Comment 類的comments_count)。您可以 也通過這個選項提供列名 而不是真/假值的指定自定義計數器緩存列(如:counter_cache => :my_custom_counter)注:指定櫃檯緩存將其添加到 那模型的使用attr_readonly的只讀屬性列表。

+0

你可以讓連接更簡單嗎? – shibly

+0

你可以用'Arel'來做。你可能需要考慮在你的'Post'模型的'comments'關聯中添加'counter_cache'列。請參閱編輯其他建議 –

1

你不需要的子查詢在這裏,你可以簡單地說:

Post.select("posts.id, posts.title, COUNT(*) count"). 
    joins(:comments). 
    group('posts.id'). 
    order('count DESC'). 
    limit(5) 
相關問題