2009-05-27 2 views
2

내가있어 이러한 테이블 : 기본적으로다중 블로그 사이트 모델링 방법은 무엇입니까?

**Sites** 
:has_many :blogs 
:has_many :pages 

**Blogs** 
:belongs_to :site 

**Pages** 
:belongs_to :site 
:belongs_to :blog 

은, 나도 같은 경로와 블로그 사이트와 관련된 또는 관련 페이지를 만들 수 있도록하려면 :

/blogs/1/pages/1 
/sites/1/pages/2 

나의 현재 설정으로, 내 페이지 테이블 blog_id 및 사이트 ID에 대한 foreign_key있다 - 난 그냥이 일을 생각했다 : 페이지가 fo를 작성하는 경우

  • 을 (블로그에 속하지 않는다는 의미), blog_id =를 NULL로 설정하고 이에 따라 site_id를 설정하십시오.

  • 그러나 블로그 (이미 사이트에 속한)에 대해 페이지를 작성하는 경우 내가 사이트 페이지 목록을 원하는 경우 관련 사이트 ID 및

을 blog_id은 그런 : 난 그냥 모든 NULL blog_ids의 페이지 테이블을 조회 할 수 있습니다, 그리고 페이지를 블로그 싶은 경우에, 나는과의 관계를 통해 얻을 수 있습니다 이미 블로그.

업데이트 : "polymorphic associations"를 사용하여 제안 된 답변을 수락했으나 단일 테이블 상속을 사용하여이 작업을 수행 할 수도 있습니까? 그렇다면 어떤 방법이 더 좋습니까?

감사합니다.

답변

5

다형성 연관을 사용할 수 있습니다.

pages 테이블에 외래 키와 유형 열을 추가하십시오. 귀하의 페이지가 속할 수있는 수업의 공통 속성을 설명하는 형용사를 찾으십시오. 나는 pageable (나에게 pageable_idpageable_type 열을 준다)을 생각해 냈다. 당신의 모델에서

# Adds "pageable_id" integer column and "pageable_type" string column. 
t.references(:pageable, :polymorphic => true) 

다형성 관계를 지정 has_many/belongs_to를 사용하는 경우 : 당신이 마이그레이션을 사용하는 경우 다음 당신의 Page 마이그레이션을 추가

class Site < ActiveRecord::Base 
    has_many :pages, :as => :pageable 
end 

class Blog < ActiveRecord::Base 
    has_many :pages, :as => :pageable 
end 

class Page < ActiveRecord::Base 
    belongs_to :pageable, :polymorphic => true 
end 

을 보라 :

# Return all pages belonging to Site with ID 12, that is, return all pages 
# with pageable_id 12 and pageable_type "site". 
Site.find(12).pages 

# Return all pages belonging to Blog with ID 3, that is, return all pages 
# with pageable_id 3 and pageable_type "blog". 
Blog.find(3).pages 

# Returns the owner (Blog or Site) of Page with ID 27. 
Page.find(27).pageable 

이게 도움이 되길 바란다. http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

기본적으로, 당신이 올바른 궤도에,하지만 당신이 뭘하려는 건지에 대한 기존의 패턴이있다 :

1

당신은 다형성 연관 데이터로 보일 것입니다.

관련 문제