Упорядочить по дочернему атрибуту - PullRequest
1 голос
/ 29 января 2012

У меня есть приложение Rails 3.1.2 с иерархическим отношением, которое выглядит следующим образом: Категории -> Обсуждения -> Комментарии

В категории много обсуждений, а в обсуждении много комментариев.

В представлении отображения категорий я показываю список всех обсуждений, относящихся к этой категории.Я использую Kaminari для нумерации страниц.До сих пор мне удавалось упорядочить их к тому времени, когда дискуссия была создана, например:

@discussions = Discussion.where(:category_id => @category.id).order('created_at desc').page(params[:page])

Однако я бы предпочел упорядочить обсуждения ко времени самой последней дискуссии.комментарий, принадлежащий этому обсуждению, как и большинство форумов, с последними обновленными обсуждениями, появляющимися в верхней части экрана.Каков наилучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 29 января 2012
class Category < Model
  has_many :discussions, :dependent => :destroy
  has_many :comments, :through => :discussions, :dependent => :destroy

  def latest_comment_time
    comments.last.created_at
  end
end

Теперь вы можете заказать обсуждения с Discussion.all.sort_by(&:latest_comment_time).

0 голосов
/ 30 января 2012

Я бы, наверное, удостоверился, что при публикации комментариев в столбце updated_at для обсуждения должна быть указана текущая отметка времени.Если вы написали весь код самостоятельно, это должно быть легко выполнено с использованием опции touch для ассоциаций.Например, вот так:

class Comment < ActiveRecord::Base
  belongs_to :commentable, :polymorphic => true, :touch => true

  ...
end

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

Если вы используете гем или что-то для своей комментируемой функции, тогда я не могу точно сказать, как это должно быть настроено, но у него должна быть некоторая опция конфигурации дляэто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...