2016-05-16 42 views
1

在我的Rails web應用程序(Rails 3.2.9,Ruby 1.9.3)中,有一個文章儀表板頁面,特定於每個用戶,他/她創建的所有文章都被列出。有一些主要類別下文章應列出。文章詳細信息顯示在表格結構中。Rails活動記錄查詢 - 分類,基於'updated_at'值排序

Sl#  Name   Reference  Updated At 

Category 1 
1  Article 1  abc abc   05/16/2016 11:12AM 
2  Article 2  pqr stu   05/14/2016 10:11PM 
3  Article 3  abc abc   05/13/2016 05:05AM 

Category 2 
4  Article 4  abc abc   05/16/2016 11:00AM 
5  Article 5  pqr stu   05/15/2016 06:41PM 

Category 3 
6  Article 6  abc abc   05/16/2016 10:12AM 
7  Article 7  pqr stu   05/01/2016 09:52PM 
8  Article 8  abc abc   05/12/2016 12:05PM 

因此,該用戶創建了8篇文章,稱爲'Ramu',它們分爲3類。文章可以隨時更新。第一條規則是,

它具有最新更新的文章類別需要在 頂部,因此所顯示在

所以,在這裏你可以看到的Category 1Article 1已經更新了最新的和然後分類2.所以,第1類,那麼分類2等的第4條

第二條規則是,在一類文章應基於在d的值的updated_at進行排序 ESC順序。

@articles = 
    @current_user.articles.order('updated_at DESC').paginate(page: params[:page], per_page: 10) 

此查詢不能得到預期的順序的結果,因爲它有一個最新更新的文章類別能夠具有較小updated_at價值相對於其他類別的文​​章文章。但最新的更新文章以及第1類的其他文章將列在最上面等等。

@articles = 
    @current_user.articles.order('category_id, updated_at DESC').paginate(page: params[:page], per_page: 10) 

以上也是不可用的,因爲它首先根據category_id進行排序。

任何人都可以請幫助我得到一個優化的MySQL查詢。謝謝。

+0

如果您明確說明您要找的內容,我會盡力幫助,但是我從中得到了什麼最遠的是,你希望最新的文章先顯示,然後是同一類別的所有文章,而不管他們的時間戳嗎? – bkunzi01

+0

請爲類別和文章添加您的Active Record類 –

回答

1
class Category < ActiveRecord::Base 
    has_many :articles 
    #has_many :ordered_articles , -> {order(updated_at: :desc)}, class_name: 'Article', foreign_key: 'category_id' 
    has_many :ordered_articles , order: "updated_at desc", class_name: 'Article', foreign_key: 'category_id' 
end 

class Article < ActiveRecord::Base 
    belongs_to :category 
end 

這是解決問題的方法

@categories = Category.select("categories.id,categories.name , max(articles.updated_at) as last_article").joins(:articles).group("categories.id").order("last_article desc").includes(:ordered_articles).where("articles.user_id = ?",current_user.id) 

所有的魔法在這裏happing。

這將返回所需的所有類別。 它將返回按文章updated_at列排序的所有類別。

其次,我在category類中增加了一個新的has_many關聯。 它的名字是ordered_articles。它就像正常的has_many :articles與訂購物品的利益相關聯。它將返回articles的所有category,訂購人爲updated_at desc。如果需要,可以在原始has_many關聯上添加這些order功能。

現在所有的categories都在@categories實例變量中可用。循環播放,並通過調用ordered_articles獲取該類別中的所有articles。i-e

@categories.each do |category| 
puts category.name 
    category.ordered_articles.each do |article| 
    puts article.title 
    end 
end 

這就是你想要的輸出。您可以根據需要獲取其他屬性。我認爲你的Category有一個名爲name的列,文章有一列title

您可以將它更改爲您的實際列。

P.S:我們可以跳過新has_many關聯可以調用articlesorder_by子句E各自category對象上:克 category.articles.order(updated_at: :desc)但是這將導致N + 1的查詢的困境。因此,爲eager load每個類別的相應文章我添加了一個新的關聯,它將以我們想要的順序返回文章

+0

謝謝您的回答。讓我檢查一下,然後回去...... –