Я думаю, что ваша посылка плохого в том смысле, что вы хотите сделать, не должно быть сделано. Я объясняю:
То, что вы хотите, может быть сделано с помощью вспомогательных методов, как так:
class Course < AR
def title
content.title
end
end
Что некрасиво, нарушает все кодирования аргумент когда-либо написанных, и его просто плохая практика. Но, кроме некоторой метамагии, которая могла бы избежать необходимости писать вспомогательные методы один за другим (обратите внимание, что я написал запись, потому что в конечном итоге они будут реализованы), конечный результат должен быть таким. Другого способа это не делать. Так что мой ответ, не делай этого.
Понимание полиморфизма непросто. Его легко реализовать, но трудно узнать, когда. Вам нужен абстрактный блок, содержащий столбцы нескольких других ресурсов только потому, что. Вы не принимаете никаких аргументов в пользу решения о создании «... модели контента, в которой есть столбцы, которые могут извлечь из курса, а также приносит пользу другим моделям в моей базе данных». Я спрашиваю. Зачем? В чем польза? зачем это делать? Он работает так же хорошо, как и ожидалось? проще ли его использовать и расширять? он заключен в капсулу? Является ли оно сухим, отдохнувшим, твердым, и все остальные аббревиатуры, используемые в наши дни?
Короткий ответ НЕТ. Это не так. Так что не делай этого. У класса курса есть название. Если другая таблица также имеет заголовок, то что? Знаете ли вы, сколько таблиц в мире имеет столбец «имя»? Если бы мы все хотели его реализовать, у нас было бы что-то вроде этого:
class School < Ar
belongs_to :name
def full_name
name.body
end
end
class Student < Ar
belongs_to :name
def full_name
name.body
end
end
, что явно нецелесообразно. Поэтому, если это не полезно для одного столбца, почему он становится полезным для большего количества столбцов?
Вывод:
- Полиморфизм не используется, чтобы повторно использовать столбцы, никогда.
- STI используется для повторного использования столбцов (вид)
- Полиморфизм можно понимать как нечто, что можно прикрепить к нескольким ресурсам. Например: Уведомления, журналы, адреса ... В основном говорят, что у курса есть адрес, а также у Студента есть адрес. Оба студента и курс являются адресными. НО НИКОГДА, НИКОГДА, НИКОГДА НЕ говорите, что контент - это ТИП адреса. Это просто неверно, форма или форма.
- В ИППП ресурс СТАНЕТ типом родителя, поэтому в ИППП курс будет ТИПОМ содержания. Также Студент будет ТИПОМ содержания. НО НИКОГДА, НИКОГДА, НИКОГДА НЕ СКАЗЫВАЙТЕСЬ С КОНЕЦ. Это просто неверно, форма или форма.
В таблице STI в таблице содержимого были бы ВСЕ столбцы курса PLUS ВСЕ столбцы любой другой таблицы, которые хотели быть курсом. Это хорошая практика для ресурсов, которые по существу, в данных одинаковые или почти (кажется, много того, что вы описали), и вы не хотите повторять код во всех дочерних классах. Все STI могут быть реализованы без STI, повторяя код родительского класса в каждом дочернем классе.
Итак, короткий ответ (немного поздно нет?). Нет, вы не можете делать то, что хотите. Вы можете
- Просто повторите столбцы каждого ресурса (предпочтительный способ для первой реализации, легко, быстро и стандарт)
- Использование STI и одну таблицу, чтобы представить все ресурсы, которые бы «совместно» содержимое информация
- Используйте полиморфизм и используйте вспомогательные методы, чтобы делать то, что вы хотите. Но не забывайте, что аксессоры - не единственные. Подумайте о таких методах, как
def title=
. Вы собираетесь перепрофилировать их все?
Извините за длину, просто повторил эту ошибку слишком много раз.