将博客功能添加到现有Rails应用程序

时间:2010-03-01 16:07:03

标签: ruby-on-rails database-design

我正在寻找一些db设计帮助。我有一个现有的应用程序,我想将以下功能添加到:

  • 支持网站博客的概念
  • 允许每个成员拥有自己的博客
  • 管理员可以发布到网站博客,
  • 会员可以发布到自己的会员博客

由于网站只能有一个博客,每个成员只能有一个博客。我认为我不需要博客表。相反,我只会将站点和用户表中的几列悬挂在blog_name,blog_tagline或其他内容中。

我的问题是:我应该使用一个表作为帖子,还是应该使用2个表(site_posts和member_posts)。

如果我使用1个表,我可以轻松地拥有一个类型列(站点或成员)和一个指向相关父记录(站点或成员)的content_id列。但是,我在想什么是在资源和控制器方面做到这一点的最佳方法。如果我有一张桌子,那么我就有一个控制器帖子。但是,根据用户的角色,他们将更新站点帖子或成员帖子。这似乎有点混乱,总是检查用户的角色只是为了更新资源。

所以,我倾向于使用2个资源(和2个表),所以我知道会员一直在使用site_posts上的member_posts和admin。

任何人对此设计有任何想法或看到任何问题?

感谢。

1 个答案:

答案 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

将魔术(和任何错误)作为练习留给读者;)