Как настроить это полиморфное отношение c? - PullRequest
0 голосов
/ 27 апреля 2020

Таблицы: (включены только соответствующие столбцы)

  • пользователи : id
  • отзывы : id , user_id , reviewable_type , reviewable_id
  • subject_ones : id
  • subject_twos : id

Модели: (это то, что я пробовал)

class User < ApplicationRecord
  has_many :reviews
end
class Review < ApplicationRecord
  belongs_to :user
  belongs_to :reviewable, polymorphic: true

  scope :subject_one, -> { where(reviewable_type: SubjectOne.name) }
end
class Reviewable < ApplicationRecord
  has_many :reviews, as: :reviewable
end
class SubjectOne < Reviewable

end
class SubjectTwo < Reviewable

end

Строки в subject_ones и subject_twos действительно не изменятся, и пользователи могут выбрать включение строк из каждой. Эти две таблицы достаточно различаются, поэтому им нужны разные таблицы, но модель данных для самого обзора одинакова. Отображение для пользователя будет отличаться для разных типов. reviews уникальны для user_id, reviewable_type и reviewable_id

Я бы хотел, чтобы конечный результат был чем-то, что я мог бы сделать user.reviews.subject_one.first.reviewable, и он возвращает первую subject_ones запись ,

По сути, мне трудно понять, как получить "рецензируемый" от review.

Прямо сейчас, если позвоните user.reviews.subject_one.first.reviewable, я получу:

PG::UndefinedTable: ERROR: relation "reviewables" does not exist LINE 8: WHERE a.attrelid = '"reviewables"'::regclass ^

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 27 апреля 2020

Разобрался - у родительского класса Reviewable отсутствует флаг self.abstract_class = true. Без этого Rails предполагает, что он должен отображаться в таблицу db, но в этом случае он должен отображаться на имя таблицы дочернего класса.

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