У меня есть следующие модели
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: схема «подтема» не существует
. Множественное число подтем дает ту же ошибку. Я чувствую, что упускаю что-то очевидное. Может кто-нибудь указать на это?
Примечание : Предупреждение о неприятном запахе. Я знаю. Если у вас есть предложения о том, как сделать этот код чище, это будет очень приятно. Я знаю Закон Деметры, но не понимаю, как получить желаемый конечный результат, не нарушая его.
: 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