named_scope, чтобы упорядочить сообщения по дате последнего комментария - PullRequest
3 голосов
/ 11 января 2010

Сообщений has_many Комментарии

Я использую searchlogic , который будет упорядочивать по именованным областям. Итак, я хотел бы, чтобы именованная область видимости упорядочивалась по последнему комментарию каждого сообщения.

named_scope :ascend_by_comment, :order => ...comments.created_at??...

Я не уверен, как сделать :joins и получить только самый последний комментарий и отсортировать его по полю created_at, все в named_scope.

Я использую mysql, к вашему сведению.

EDIT:

Это запрос SQL, который я буду пытаться эмулировать:

SELECT tickets.*, comments.created_at AS comment_created_at FROM tickets 
INNER JOIN 
(SELECT comments.ticket_id, MAX(comments.created_at) AS created_at 
  FROM comments group by ticket_id) comments 
ON tickets.id = comments.ticket_id ORDER BY comment_created_at DESC;

Ответы [ 2 ]

1 голос
/ 11 января 2010
named_scope :ascend_by_comment,
  :joins => "LEFT JOIN comments ON comments.post_id = posts.id",
  :group => "id",
  :select => "posts.*, max(comments.created_at) AS comment_created_max",
  :order => "comment_created_max ASC"

Вы можете попытаться оптимизировать его, но он должен работать и дать вам несколько советов, как это сделать.

Редактировать

После того, как вы отредактировали вопрос и показали, что хотите внутреннее объединение (без сообщений без комментариев?), Вы, конечно, можете изменить :joins => "..." на :joins => :comments.

1 голос
/ 11 января 2010

Вы можете сделать это, присоединившись к соответствующей модели или включив ее в область видимости, что-то вроде этого поможет:

named_scope :ascend_by_comment, :joins => :comments, :order => "comments.created_at DESC"

...