【问题标题】:Adding a blog feature to existing Rails app向现有 Rails 应用程序添加博客功能
【发布时间】:2011-01-22 08:42:36
【问题描述】:

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

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

由于一个站点只能有一个博客,而每个成员只能有一个博客。我不认为我需要一个博客表。相反,我将在 Sites 和 Users 表中为 blog_name、blog_tagline 或其他内容挂起几列。

我的问题是:我应该使用一张表来发帖,还是应该使用两张表(site_posts 和 member_posts)。

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

所以,我倾向于使用 2 个资源(和 2 个表),所以我知道成员总是在 member_posts 上工作,而管理员在 site_posts 上工作。

任何人对此设计有任何想法或发现任何问题?

谢谢。

【问题讨论】:

    标签: ruby-on-rails database-design


    【解决方案1】:

    您可能会考虑一个表(posts),但有两个继承自它的子类(SitePost 和 MemberPost)。 这允许您将大部分功能放入 post 模型中。

    您甚至可以将大部分控制器功能放入 PostsController

    然后,您可以为 SitePostController 和 MemberPostController 拥有两个子类控制器 - 它们继承自 PostController...但针对资源安全的特定要求具有不同的 before_filters。

    ...事实上,您甚至可以使用单个 PostsController 并让两个子类中的每一个都有自己的“can_be_edited_by?”方法... 在 before_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
    

    路由魔法(以及任何错误)留给读者作为练习;)

    【讨论】:

    • 谢谢,感谢 cmets。我想,我想知道这种方法是否有任何特别的好处。您的方法比使用 2 张桌子更干燥。这是主要的好处吗?
    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多