我正在寻找一些db设计帮助。我有一个现有的应用程序,我想将以下功能添加到:
由于网站只能有一个博客,每个成员只能有一个博客。我认为我不需要博客表。相反,我只会将站点和用户表中的几列悬挂在blog_name,blog_tagline或其他内容中。
我的问题是:我应该使用一个表作为帖子,还是应该使用2个表(site_posts和member_posts)。
如果我使用1个表,我可以轻松地拥有一个类型列(站点或成员)和一个指向相关父记录(站点或成员)的content_id列。但是,我在想什么是在资源和控制器方面做到这一点的最佳方法。如果我有一张桌子,那么我就有一个控制器帖子。但是,根据用户的角色,他们将更新站点帖子或成员帖子。这似乎有点混乱,总是检查用户的角色只是为了更新资源。
所以,我倾向于使用2个资源(和2个表),所以我知道会员一直在使用site_posts上的member_posts和admin。
任何人对此设计有任何想法或看到任何问题?
感谢。
答案 0 :(得分:1)
您可以考虑一个表(帖子),但是从它继承的两个子类(SitePost和MemberPost)。 这允许您将大部分功能放入后模型中。
您甚至可以将大多数控制器功能放入PostsController
然后,您可以为SitePostController和MemberPostController创建两个子类控制器 - 它们继承自PostController ...但是对于资源安全性的特定要求具有不同的before_filters。
...实际上,您甚至可以使用单个PostsController,让两个子类中的每一个都拥有自己的“can_be_edited_by?” method ...在post_filter中为你的帖子的成员方法调用。只需确保将帖子实例化为正确的类型 - 这可能需要一些路由魔法来控制你的“post_type”。例如:
class Post < ActiveRecord::Base
...post-specific methods
end
class MemberPost < Post
def can_be_edited_by?(user)
... MemberPost-specific authorisation
end
end
class SitePost < Post
def can_be_edited_by?(user)
... SitePost-specific authorisation
end
end
class PostsController <...
before_filter :requires_login
before_filter :fetch_post, :only => [:edit, :update, :delete, :show]
before_filter :can_edit_post, :only => [:edit, :update, :delete, :show]
...
def can_edit_post
@post.can_be_edited_by?(current_user)
end
def fetch_post
post_class = (params[:post_type] || 'SitePost').constantize
@post = post_class.find(params[:id])
end
end
将魔术(和任何错误)作为练习留给读者;)