Комбинированный заказ с ассоциацией в Rails 3 - PullRequest
1 голос
/ 23 марта 2012

У меня две модели, пост и комментарий. Сообщения имеет много комментариев и комментариев принадлежит сообщениям.

То, что я пытаюсь сделать, - это иметь список постов, упорядоченных по дате создания, если в нем нет комментариев. Затем необходимо указать дату создания последнего комментария.

Теперь я знаю, что могу включить такие ассоциации:

Post.find(:all, :include => [:comments], :order => "comments.created_at DESC, posts.created_at DESC")

Но это упорядочит все сообщения с комментариями, а затем сообщения без комментариев. Я не хочу, чтобы они были заказаны отдельно, но вместе взятые.

Решение также должно быть совместимо с гемом paginate, таким как will_paginate.

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

Теперь он работает со следующим кодом:

posts_controller.rb

@posts = Post.order('updated_at DESC').page(params[:page]).per_page(10)
comments_controller.rb

@post = Post.find(params[:post_id])
@post.update_attributes!(:updated_at => Time.now)

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Я бы порекомендовал:
Добавить поле даты last_commented_at в вашу модель Post.Всякий раз, когда кто-то комментирует сообщение, обновите это поле.Это немного нормализует вашу структуру БД, но ваш запрос будет быстрее и проще.

1 голос
/ 23 марта 2012

Postgres

Post.paginate(:include => [:comments],
  :order => "COALESCE(comments.created_at, posts.created_at)",
  :page => 1, :per_page => 10)

MySQL

Post.paginate(:include => [:comments], 
  :order => "IFNULL(comments.created_at, posts.created_at)", 
  :page => 1, :per_page => 10)
...