2012-01-31 55 views
1

我有2個型號:Microposts(其中has_many :comments)和評論(其中belongs_to :micropost)。按評論數(Rails)排序微博?

在下面的視圖:

視圖/微柱/ index.html.erb:

<h2>Micropost Index</h2> 
<% @microposts.each do |micropost| %> 
    <h2><%= micropost.title %></h2> 
    <p><%= micropost.content %></p> 
    <p><%= micropost.comments.count %></p> 
    <ul> 
    <li><%= link_to 'Show', micropost %></li> 
    <li><%= link_to 'Edit', edit_micropost_path(micropost) %></li> 
    <li><%= link_to 'Destroy', micropost, confirm: 'Are you sure?', method: :delete %></li> 
    </ul> 
    <br /> 
<% end %> 

控制器/ microposts.rb:

def index 
    @microposts = Micropost.all 
    end 

我能夠以獲得每個微博的評論數量:

<p><%= micropost.comments.count %></p> 

如何根據評論數量對微博進行排序?

任何建議來完成此?

回答

1

可以在micropost.rb和排序它就像一個虛擬的屬性創建一個方法:

def comments_count 
    comments.count 
end 

然後您的收藏與sort_by方法排序:

<% @microposts.sort_by(&:comments_count).map do |micropost| %> 
    <%= micropost.title %> 
    ... 
<% end %> 

此外,您還可以使用reverse方法,如果你需要一個相反的排序方向。

+0

,我確實做到了這一點,我得到這個錯誤:'未定義的方法'微柱」爲#<微柱:0xabb33d4>' – alexchenco 2012-01-31 07:14:26

+0

對不起,我已經更新了我的答案。當然,我們應該在方法中使用'comments.count'而不是'micropost.comments.count'。現在就試試。 – 2012-01-31 07:21:24

+0

對不起,我必須放置'reverse'方法? – alexchenco 2012-01-31 07:26:16

3

你可以通過計算每個微博的評論來做一個愚蠢的排序,但這不是一個好主意。因爲每次調用索引操作時,rails都會執行N + 1個數據庫查詢,其中N是微博的數量。

這裏最好的解決方案是使用Rails的counter_cache功能。它是您的微博數據庫表中的一個單獨列,其中存儲了評論數量。此外,每次創建新評論或刪除評論時都會自動更新。

首先,您需要向數據庫添加一列。要做到這一點,創建這樣的遷移: add_column :microposts, :comments_count, :integer, :default => 0, :null => false

後,在您的評論的模型修改代碼,類似的東西: belongs_to :micropost, :counter_cache => true

畢竟這些變化在微柱的comments_count列將增加每您每次刪除評論時都會創建新的評論和減量。此外,您還可以和像這種通過此列的值微觀柱:Strage

@microposts = Micropost.order('comments_count ASC').all

+0

嘿它工作,但是當我添加這個:'@microposts = Micropost.sort('comments_count ASC')。所有'到我的微控制器控制器「我得到這個錯誤:'未定義的方法'排序'爲#' – alexchenco 2012-01-31 07:31:08

+1

這實際上是因爲我是一個白癡,它不是'排序',它是'訂單' – rwz 2012-01-31 07:47:47

+0

哈哈,沒關係,我想通了。 – alexchenco 2012-01-31 07:54:34