2016-05-16 5 views
1

私のRails Webアプリケーション(Rails 3.2.9Ruby 1.9.3)には、作成したすべての記事がリストされる各ユーザー固有の記事ダッシュボードページがあります。記事が掲載されるべき主なカテゴリがいくつかあります。商品詳細はテーブル構造で表示されます。 Rails Active Record Query - '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の第4条ので、カテゴリー1は、その後、カテゴリー2など

二番目のルールは、カテゴリの下の記事はDでupdated_atの値に基づいて をソートしなければならないということですESC命令。

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

Aアップデートされた最新記事を持っているカテゴリーは、他のカテゴリの記事に比べて小さい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

カテゴリと記事のアクティブレコードクラスを追加してください –

答えて

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 

は魔法のすべてがここにhappingされるあなたの問題を解決

@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) 

です。

これは、すべてのカテゴリを必要な順序で返します。 記事updated_at列で注文されたすべてのカテゴリを返します。

第2に、has_manyの関連付けをcategoryクラスに追加しました。 名前はordered_articlesです。注文された商品の特典との関連は通常のhas_many :articlesと同じです。 updated_at descで注文されたcategoryのすべてのarticlesを返します。これらの追加は、元の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:グラム category.articles.order(updated_at: :desc)が、これはN + 1クエリのジレンマが発生します:私たちは新しいhas_many関連付けをスキップすることができますがorder_by句eで各categoryオブジェクトにarticlesを呼び出すことができます。だからeager load各カテゴリの対応する記事私は希望の順序で記事を返す新しい協会を追加しました

+0

ありがとうございます。私がチェックして戻ってみましょう... –

関連する問題