2013-07-23 3 views
0

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

Таким образом, я создал модель для «страниц», в которой есть поля базы данных, такие как имя, описание и т. Д. Он также имеет ассоциацию «has_many: widgets».

Вот где я в тупик. У меня есть список виджетов, которые пользователи могут использовать. Такие вещи, как «обо мне», «фотогалерея», «комментарии», «видео» и т. Д. Они могут выбрать один из них, настроить содержимое и добавить на свою страницу.

Я рисую, когда пользователь выбирает и настраивает виджет, я добавлю запись в таблицу виджетов с именем «own_to user_id». Однако мне нужно указать, какой виджет пользователь выбрал, и введенное пользовательское содержимое.

Как это реализовать в Rails? Где я могу определить каждый тип виджетов?

Я могу придумать несколько способов, но не уверен, какой из них лучший.

  • Один из вариантов - использовать модель для каждого виджета. У меня были бы AboutMeWidget, VideoWidget и т. Д. Это позволит мне настраивать каждую модель с любыми полями, которые могут понадобиться виджету. Однако это не кажется эффективным и потребует слишком много моделей.
  • Другой вариант - определить типы виджетов где-нибудь (но где?), А затем упростить «widget_type» в таблице виджетов. (Следовательно, таблица будет содержать «принадлежит_по: пользователю» и «has_one: widget_type».) Я также должен иметь поле для данных, введенных пользователем (возможно, через XML?).
  • Последний вариант, о котором я могу думать, это использовать классы Ruby для определения виджетов. Когда пользователь настроил виджет, я создам объект из класса виджетов и сохраню этот объект.

Есть ли еще лучший способ?

ответ

1

Если конкретные поля для данной реализации виджета не обязательно должны быть доступны для поиска, у меня возникнет соблазн внести их в сериализованное поле.

class Page << AR 
    has_many :embedded_widgets 
    has_many :widgets, :through => :embedded_widgets 
end 

class Widget << AR 
    has_many :embedded_widgets 
end 

class AboutMeWidget << Widget 
class VideosWidget << Widget 
... etc ... 

class EmbeddedWidget << AR 
    belongs_to :page 
    belongs_to :widget 
    serializes :data 
end 
+0

благодарит за сообщение Philip. Я не использовал has_many с «сквозным», поэтому мне сложно описать, как это будет работать. Какова цель модели страницы, имеющей «has_many: widgets,: through =>: embedded_widgets»? Если я правильно понимаю, все это позволяет мне сделать что-то вроде файла page.find (2) .widgets. Но мне все равно, когда у меня есть конкретная страница, это встроенные виджеты на этой странице. Так как у EmbeddedWidget есть «own_to: widget», я могу сделать «Page.find (2) .embeddedwidgets.widget, который скажет мне, что это за класс. – Nick

+0

Возможно, вам вообще не нужен файл Page.has_many.widgets. есть ситуация, когда вы просто хотите, чтобы имена виджетов на странице принадлежали без информации пользовательского поля, что бы это сделать. –

Смежные вопросы