2015-10-23 91 views
1

我的文章如何通過Rails中的子屬性對數組進行排序?

class Article < ActiveRecord::Base 
    has_many :comments, dependent: :destroy 
    validates :title, length: { minimum: 3, maximum: 100 } 
    validates :text, length: { minimum: 5, maximum: 3000 } 
end 

,我有

class Comment < ActiveRecord::Base 
    belongs_to :article 
    validates :body, presence: true, 
        length: { maximum: 3000 } 
end 

我需要向用戶顯示物品可獲取的名單,而是由意見的時間戳排序。就像圖像板一樣,當你在線上發佈內容時,線程會「碰撞」到頂端。

我設法與<% @articles.joins(:comments).order('comments.created_at desc').each do |article| %>來。它排列正確的方式,但它顯示相同的線程時間上的帖子數。例如,如果一個線程有5個回覆,則向用戶顯示5個不同的時間。我怎樣才能解決這個問題?使用組.group('articles.title')實際工作。但我發現加入不包括沒有評論的文章。我把它切換到包括,顯然它工作。但是現在我有一個問題,那就是沒有任何評論的帖子就會出現在列表的最底部,我需要它們在最上面。一個解決方案是在創建文章時創建一個空評論,但我不知道如何做--EDIT2-我解決了它。我做了一個自動評論與帖子一起創建,所以每個帖子都有一個帶時間戳的評論來比較。我只是把在articles_controller.rb此行@comment = @article.comments.create(body: '~start~')內@ article.save環

+0

無需創建空的註釋。大多數數據庫可以首先或最後一次訂購空值。 postgres中的例子是'@ articles.joins(:comments).group('articles.title')。order('comments.created_at DESC NULLS FIRST')'[link](http://www.postgresql.org/ docs/9.4/static/queries-order.html) – maartencls

回答

2

您可以使用組?

# controller 
@articles = Article.includes(:comments).order('comments.created_at desc') 
+0

完美運作!哇,我不相信!非常感謝 –

1

您可以致電查詢#distinct:由

<% @articles.joins(:comments).order('comments.created_at desc').group('articles.title').each do |article| %> 
相關問題