Я только начинаю с рельсов и сталкиваюсь с небольшой проблемой. То, что я пытаюсь реализовать, - это способ разрешить пользователям создавать «страницы», на которые они могут ссылаться на виджетов.Реализация модели модели в рельсах
Таким образом, я создал модель для «страниц», в которой есть поля базы данных, такие как имя, описание и т. Д. Он также имеет ассоциацию «has_many: widgets».
Вот где я в тупик. У меня есть список виджетов, которые пользователи могут использовать. Такие вещи, как «обо мне», «фотогалерея», «комментарии», «видео» и т. Д. Они могут выбрать один из них, настроить содержимое и добавить на свою страницу.
Я рисую, когда пользователь выбирает и настраивает виджет, я добавлю запись в таблицу виджетов с именем «own_to user_id». Однако мне нужно указать, какой виджет пользователь выбрал, и введенное пользовательское содержимое.
Как это реализовать в Rails? Где я могу определить каждый тип виджетов?
Я могу придумать несколько способов, но не уверен, какой из них лучший.
- Один из вариантов - использовать модель для каждого виджета. У меня были бы AboutMeWidget, VideoWidget и т. Д. Это позволит мне настраивать каждую модель с любыми полями, которые могут понадобиться виджету. Однако это не кажется эффективным и потребует слишком много моделей.
- Другой вариант - определить типы виджетов где-нибудь (но где?), А затем упростить «widget_type» в таблице виджетов. (Следовательно, таблица будет содержать «принадлежит_по: пользователю» и «has_one: widget_type».) Я также должен иметь поле для данных, введенных пользователем (возможно, через XML?).
- Последний вариант, о котором я могу думать, это использовать классы Ruby для определения виджетов. Когда пользователь настроил виджет, я создам объект из класса виджетов и сохраню этот объект.
Есть ли еще лучший способ?
благодарит за сообщение Philip. Я не использовал has_many с «сквозным», поэтому мне сложно описать, как это будет работать. Какова цель модели страницы, имеющей «has_many: widgets,: through =>: embedded_widgets»? Если я правильно понимаю, все это позволяет мне сделать что-то вроде файла page.find (2) .widgets. Но мне все равно, когда у меня есть конкретная страница, это встроенные виджеты на этой странице. Так как у EmbeddedWidget есть «own_to: widget», я могу сделать «Page.find (2) .embeddedwidgets.widget, который скажет мне, что это за класс. – Nick
Возможно, вам вообще не нужен файл Page.has_many.widgets. есть ситуация, когда вы просто хотите, чтобы имена виджетов на странице принадлежали без информации пользовательского поля, что бы это сделать. –