2010-03-01 3 views
2

일부 db 디자인 도움말을 찾고 있습니다. 각각 자신의 블로그를 사이트에 게시 할 수 있습니다 기존 레일스 앱에 블로그 기능 추가하기

  • 관리자가에
  • 회원들에게 허용

    • 지원 사이트 블로그의 개념을 : 난에 다음과 같은 기능을 추가 할 기존 응용 프로그램이 사이트는 하나 개의 블로그가 수 있기 때문에 블로그,
    • 회원은 자신의 회원 블로그

    에 게시 할 수 있으며, 각 구성원은 하나 개의 블로그를 가질 수 있습니다. 나는 Blog 테이블이 필요하다고 생각하지 않는다. 대신 나는 blog_name, blog_tagline 또는 무엇인가를위한 Sites와 Users 테이블에서 두 개의 컬럼을 걸어 놓을 것이다.

    제 질문은 : 게시물에 하나의 표를 사용해야 하나, 대신 2 개의 표 (site_posts 및 member_posts)를 사용해야합니까?

    1 개의 표를 사용하면 유형 열 (사이트 또는 회원)과 관련 상위 레코드 (사이트 또는 회원)를 가리키는 content_id 열을 쉽게 가질 수 있습니다. 그러나 리소스와 컨트롤러 측면에서이 작업을 수행하는 가장 좋은 방법은 무엇인지 생각하고 있습니다. 만약 내가 1 테이블을 누른 다음 나는 하나의 컨트롤러 게시물을 가지고있다. 그러나 사용자의 역할에 따라 사이트 소식이나 회원 소식을 업데이트 할 수 있습니다. 이것은 좀 지저분 해 보입니다. 항상 리소스를 업데이트하기 위해 사용자의 역할을 확인하는 것입니다.

    그래서 2 개의 리소스 (및 2 개의 테이블)를 향해 기울어 져 있으므로 회원은 항상 site_posts의 member_posts 및 admins에서 작업하고 있습니다.

    누구나이 디자인에 대한 의견이 있거나 문제가 있습니까?

    감사합니다.

  • 답변

    1

    한 테이블 (게시물)을 고려할 수도 있지만 두 개의 하위 클래스 (SitePost 및 MemberPost)는이 테이블을 상속합니다. 이 기능을 사용하면 대부분의 기능을 포스트 모델에 넣을 수 있습니다.

    당신도가 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 
    

    라우팅 마술 (그리고 버그) 독자들에게 숙제로 남긴다)

    +0

    덕분에, 나는 의견을 주셔서 감사합니다. 나는이 접근법에 어떤 특별한 이점이 있는지 궁금합니다. 두 테이블을 사용하는 것보다 접근 방법이 더 위험합니다. 이것이 주요 이점입니까? –

    +0

    예 - 이것이 가장 큰 이점입니다. –