我正在构建一个网站,其中包含由一组小部件组成的用户定义页面。
小部件非常基本,类似于您在Blogger中找到的内容。一些小部件用于基本结构(列表,表格)的数据收集/格式化表示,而其他小部件则提供更复杂的功能(博客,相册等)
我想允许用户选择在他们的页面上显示哪些小部件并重新排序。
我正在考虑让Widgets成为STI(例如BlogWidget,GalleryWidget),每个Widget实例都有一个fkey user_id和一个排序位置。
然后用户的show.html.erb将包含:
for widget in current_user.widgets
render widget
end
有更好的方法吗?
答案 0 :(得分:1)
我会创建两个模型,“Widgets”和“UserWidgets”,它们看起来如下:
Widgets:
ID (Primary Key)
Name
Description
etc...
UserWidgets:
ID
Position
Widget_ID (Foreign Key -> Widgets.ID)
User_ID (Foreign Key -> Users.ID)
设置正确的关联,这样您就可以简单地使用@ user.widgets来获取所有小部件的列表。如果您将窗口小部件命名为与数据库中的名称相同,则只需在视图/布局/部分中执行以下操作:
<% @user.widgets do |w| %>
<%= javascript_include_tag w.name %>
<% end %>
这当然是假设您将每个窗口小部件分隔到它自己的自包含JavaScript文件中(这是我首选的方法)。
答案 1 :(得分:0)
我最终实现了这样的事情:
class Placement < ActiveRecord::Base
belongs_to :widget, :polymorphic => true
belongs_to :container, :polymorphic => true
acts_as_double_polymorphic_join(
:widgets =>[:blogs, :galleries, :twitter_feeds],
:containers => [:pages, :users, :groups]
)
acts_as_list :scope => :container
end