2010-03-01 88 views
2

我正在尋找一些數據庫設計幫助。我有,我想下面的功能添加到現有的應用程序:將博客功能添加到現有的Rails應用程序

  • 支持站點博客的概念
  • 允許成員,每個人都有自己博客
  • 管理員可以張貼到網站博客,
  • 會員可以發佈到自己的博客成員

由於網站只能有一個博客,每個成員只能有一個博客。我不認爲我需要一個博客表。相反,我只需將blog_name,blog_tagline等網站和用戶表中的幾列懸掛起來即可。

我的問題是:我應該使用一個表的帖子,還是應該使用2個表格(site_posts和member_posts)來代替。

如果我使用1表,我可以很容易地有一個指向相關父記錄(站點或成員)的類型列(站點或成員)和content_id列。但是,我想在資源和控制器方面做什麼是最好的方法。如果我有一個表,那麼我會有一個控制器的職位。但是,根據用戶的角色,他們會更新網站帖子或會員帖子。這似乎有點混亂,總是檢查用戶的角色只是爲了更新資源。所以我傾向於2個資源(和2個表格),所以我知道成員總是在site_posts上的member_posts和admins上工作。

任何人對此設計有任何想法或看到任何問題?

謝謝。

回答

1

您可能會考慮一個表格(帖子),但會從它繼承兩個子類(SitePost和MemberPost)。 這使您可以將大部分功能放入後期模型中。

你甚至可以把大部分的控制器功能到PostsController

然後,您可以有SitePostController和MemberPostController 2個控制器 - 從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 

路由魔術(和任何錯誤)作爲練習留給讀者;)

+0

謝謝,我很欣賞的意見。我想,我想知道這種方法是否有任何特別的好處。你的方法比使用2個表更方便。這是主要的好處嗎? – 2010-03-01 16:25:40

+0

是的 - 這是主要的好處。 – 2011-11-22 09:15:42

相關問題