Сортировка запроса на основе ассоциации на 2 или более уровней

У меня есть следующие модели

class Post < ActiveRecord::Base
  belongs_to :user, :counter_cache => true
  belongs_to :subtopic      
end


class Subtopic < ActiveRecord::Base
  belongs_to :category
  has_many :posts, :dependent => :destroy
end

class Category < ActiveRecord::Base
  has_many :posts, :through => :subtopics
  has_many :subtopics, :dependent => :destroy
end

На странице сообщений / указателя я хочу добавить сортировку с возможностью нажатия для заголовки столбцов. Это нормально, за исключением того, что я показываю некоторую информацию на двух уровнях:

  • атрибуты сообщения
    • название подтемы
      • название категории

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

@posts = Post.includes(:user, :subtopic => :category).paginate(:page =>1, :order => 'subtopics.name ASC')

. Это возвращает те результаты, которые мне нужны. Когда я пытаюсь пойти на один уровень глубже с

@posts = Post.includes(:user, :subtopic => :category).paginate(:page =>1, :order => 'subtopic.categories.name ASC')

, я получаю PGError: ERROR: схема «подтема» не существует . Множественное число подтем дает ту же ошибку. Я чувствую, что упускаю что-то очевидное. Может кто-нибудь указать на это?

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


ОБНОВЛЕНИЕ 8/3

: ActiveRecord или PostgreSQL вызывают еще одну ошибку в действии контроллера. . В консоли базы данных действует следующий оператор:

SELECT * from "posts" LEFT OUTER JOIN "users" ON "users"."id" = "posts"."user_id" LEFT OUTER JOIN "subtopics" ON "subtopics"."id" = "posts"."subtopic_id" LEFT OUTER JOIN "categories" ON "categories"."id" = "subtopics"."category_id" ORDER BY categories.name ASC LIMIT 30;

Приведенный выше оператор SQL приблизительно равен тому, что сгенерирован из приведенного ниже оператора. Приведенный ниже код rails действителен в консоли rails , но не в моем действии контроллера для Post # index

 @posts = Post.includes(:user, :subtopic => :category).paginate(:page =>1, :order => 'categories.category_name ASC', :conditions => ["posts.flags_count < ?", Flag.flag_threshold] )

Ошибка: https: //gist.github .com / 1124135

Эта ошибка возникает для категорий : order => '. ... подтемы ' и : order =>'. ... ' но не для : order => (столбец в сообщениях) . Похоже на проблему с оператором JOIN, который генерирует ActiveRecord, но фактический оператор SQL выглядит так, как будто он должен работать для меня.


Обновление 8/4 : Когда я включаю ведение журнала SQL в своей среде (используя сценарий оболочки ), я вижу, что запросы SQL, которые ActiveRecord генерирует в консоли rails и (контроллер на) сервере rails , отличаются.

В частности, на сервер, AR добавляет к определенным столбцам добавление "post.", например posts.users.display_name вместо users.display_name . Это происходит только на сервере , и только когда я включаю в запрос : order => (столбец без сообщений) ASC / DESC

6
задан Eric Hu 4 August 2011 в 19:59
поделиться