1

will_paginate gem と rails 3.2.3 を使用しています。最新の投稿順に並べられた特定のタグを持つすべての投稿を表示しようとしているので、これを使用します。

  @posts = Post.find_by_post_type_label(session[:current_post_type],@selected_labels)
             .paginate(:page => params[:page], :order => "comments.created_at DESC").all

しかし、それは投稿を順不同で返します。各ページは並べ替えられますが、2 ページ目には最初のページにあるはずの投稿が表示されます。

例:

Post.find_by_post_type_label(1,[])

投稿 [1,2,3,4,5,6,7,8,9,10] を返します。それぞれの最新のコメントは何ヶ月も前のものです。それが生成するSQLは次のとおりです。

 SELECT `posts`.* FROM `posts` WHERE `post`.`post_type_id` = 1

 SELECT `comments`.* FROM `comments` WHERE `comments`.`post_id` IN ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ) ORDER BY created_at DESC

注文して制限すると、次のようになります。

Post.find_by_post_type_label(1,[]).order(comments.created_at DESC).limit(5)

これが will_paginate のやり方で、投稿 2,3,4,5,7 を返します

これを生成した後:

SELECT DISTINCT `post`.id FROM `posts` LEFT OUTER JOIN
`comments` ON `comments`.`post_id` = `post`.`id` WHERE 
`post`.`post_type_id` = 1 ORDER BY posts.created_at DESC LIMIT 5

 SELECT `post`.`id` AS t0_r0, `post`.`user_id` AS t0_r1, `post`.`name` AS 
 t0_r2, `post`.`image_id` AS t0_r3, `post`.`post_type_id` AS t0_r4, 
`post`.`description` AS t0_r5, `post`.`featured` AS t0_r6, `post`.`approved`
AS t0_r7, `comment`.`id` AS t1_r0, `comments`.`post_id` AS t1_r1, 
`comments`.`image_id` AS t1_r2, `comments`.`edits` AS t1_r3, 
`comments`.`color` AS t1_r4, `comments`.`min_reputation` AS t1_r5, 
`comments`.`created_at` AS t1_r6, `comments`.`updated_at` AS t1_r7 FROM 
`post` LEFT OUTER JOIN `comments` ON `comments`.`post_id` = 
`post`.`id` WHERE `post`.`post_type_id` = 1 AND `post`.`id` IN (2, 3, 
4, 5, 7) ORDER BY comments.created_at DESC

注文する前に明らかに制限されていますが、それを変更する方法がわかりません。どんな助けでもいただければ幸いです

編集 1

関係は次のようになります。

Class Post
  belongs_to :user
  belongs_to :post_type
  has_many :comments, dependent: :destroy, order: 'created_at DESC'
  has_and_belongs_to_many :labels

Class Comment
  belongs_to :post
  belongs_to :user

コメントは、データベースでタイムスタンプを持つ唯一のものです。最初のコメントは、投稿の作成時に保持されます。

4

2 に答える 2

1

このSQLをfind_by_sqlで使用して巻き上げました

SELECT  p1.*, iv.created_at FROM posts p1
INNER JOIN ( SELECT p2.id id, max(c.created_at) created_at FROM posts p2
            INNER JOIN comments c ON c.post_id = p2.id
            GROUP BY p2.id)
iv ON p1.id=iv.id ORDER BY iv.created_at DESC LIMIT 5
于 2012-07-18T20:47:27.403 に答える
0

メソッドfind_by_sqlを検討する必要があります

したがって、次のようにクエリを書き直すことができます。

ts = Post.find_by_sql("SELECT * FROM posts WHERE post_type_id = ? and id in (?) ORDER BY created_at DESC LIMIT 5", session[:current_post_type], @selected_labels).paginate(:page => params[:page]).all

@selected_labels が何であるかわかりません。また、これはコメントではなく Post.created_at でソートされます。コメントで投稿をソートする理由がわかりません...最もアクティブなものを表示しますか?最初に投稿しますか?

于 2012-07-11T22:18:01.610 に答える