2008-09-15 4 views
8

RoR 튜토리얼은 ORM이 작동하도록 테이블 당 하나의 모델을 가정합니다. My DB 스키마는 개념적으로 5 개의 기능 그룹으로 나뉘어 진 약 70 개의 테이블을 가지고 있습니다. 예를 들어 주어진 테이블은 하나의 기능 그룹에만 있고 다른 그룹의 테이블 간의 관계는 최소화됩니다. 그래서 : 모델을 디자인해야합니까? 개념적 그룹당, 아니면 단순히 70 개의 레일스 모델을 갖고 그룹화를 '개념적'으로 두어야합니까? 감사합니다.Ruby on Rails의 모델 설계를위한 모범 사례

답변

8

테이블/모델을 이름별로 개념적으로 그룹화 (거의 1 : 1 테이블 모델 관계)하는 것으로 확인하여 큰 앱 중 하나에서이를 설명합니다. 예 :

events 
event_types 
event_groups 
event_attendees 
etc... 

그런 식으로 TextMate 등을 사용하면 모델 파일이 알파 정렬로 잘 그룹화됩니다. 나는이 응용 프로그램에서 80 모델을 가지고 있으며, 일을 정리 유지하기에 충분히 잘 작동합니다.

+0

물론 문제가 깔끔하게 해결됩니다. 감사합니다! – NickR

10

대부분 70 개의 모델이 있어야합니다. 모델마다 네 개의 네임 스페이스를 가질 수 있습니다. 각 네 개의 네임 스페이스가 네 개의 네임 스페이스를 가질 수 있습니다. 각 그룹에 공통적 인 기능이있을 가능성이 큽니다. 이 경우 각 그룹에 해당 동작을 포함하는 모듈을 만들고 각 관련 모델에이를 포함시킵니다. 공유 기능이 없더라도 모델링을 통해 개념 그룹에 대한 모델을 신속하게 쿼리 할 수 ​​있습니다.

+0

감사합니다. 갑자기 왜 모듈을 사용하고자하는지 이해합니다. 약간의 독서를하는 것. .. – NickR

6

모든 ActiveRecord 매직을 활용하려면 테이블 당 하나의 모델을 사용해야합니다.

그러나 모델 디렉토리에서 70 개의 파일을 관리 할 필요가 없도록 모듈과 하위 디렉토리를 사용하여 모델을 네임 스페이스로 그룹화 할 수도 있습니다. 모델 관리자 : 사용자 및 관리자 :: 그룹

app/models/admin/user.rb 
app/models/admin/group.rb 

및 게시에 대한

app/models/publishing/article.rb 
app/models/publishing/comment.rb 

:: 제 및 게시 ::

코멘트 :

예를 들어, 당신은 할 수 있습니다

등 ...

+0

Thankyou! 하위 디렉토리/네임 스페이스는 좋은 해결책입니다. Nick – NickR

1

레일 스탠드를 사용할 수있는 경우가 아주 적을 수 있습니다. rd 단일 테이블 상속 모델. 아마도 하나의 특정 기능 그룹에있는 모든 클래스는 동일한 필드 (또는 거의 모두 동일)를 가질 것입니다. 이 경우, DRYness STI 제안을 활용하십시오. 하지만 이해가되지 않는 경우에는 표 당 클래스를 사용하십시오.

테이블 당 클래스 버전에서는 일반 기능을 기본 클래스로 쉽게 가져올 수 없습니다. 대신 모듈로 가져옵니다. 다음과 같은 계층 구조가 유용 할 수 있습니다

app/models/admin/base.rb - module Admin::Base, included by all other Admin::xxx 
app/models/admin/user.rb - class Admin::User, includes Admin::Base 
app/models/admin/group.rb - class Admin::Group, includes Admin::Base 
4

칠십 테이블과 개념의 관계가 좋은 대답을 줄 정말 수 없습니다의 성격에 대한 자세한 내용을 모른 채. 이러한 레거시 테이블 또는 처음부터 이것을 설계 했습니까?

테이블이 어떤 종류의 상속 패턴으로 관련되어 있거나있을 수 있습니까? Rails는 제한된 형태의 상속을 수행 할 수 있습니다. 단일 테이블 상속 (STI)을 찾으십시오.

필자는 70 개의 테이블로 작업하는 것을 피하는 데 많은 노력을 기울였습니다. 작업이 굉장히 많기 때문입니다. 모델 번호 & 컨트롤러와 4 개 이상의 뷰, 헬퍼, 레이아웃 및 메모리는 말할 것도없이 테스트합니다. ind에서 디자인을 지키는로드 이슈. 당연히 내가 시간당 지불하고 반복을 보상 할만큼 충분히 돈을 받고 있지 않는 한.

1

이미 언급했듯이 데이터베이스 스키마 등을 알지 못해도 괜찮은 조언을하기는 어렵지만 필자는 각 테이블마다 하나씩 70 개 이상의 모델을 만드는 경향이 있습니다.)

일부 모델을 버리면 빠져 나올 수는 있지만 비용은 무시할 수 있습니다.

각 모델 (srboisvert의 answerd)에 대한 컨트롤러 +보기를 만들 필요가 없습니다. 당신은 각 자원 (내가 70보다 훨씬 적을 것으로 예상 할 것입니다 - 아마도 당신의 설명에 의해 판단 할 때 단지 10 또는 15 정도)에 대한 컨트롤러 만 필요합니다.

이 당신의 각 테이블에가 "개체"예를 들어, "자동차"테이블 간주됩니다 또는 일부 테이블 들고 있습니다

4

메이킹 (70 개) 모델에서 점프하기 전에, 당신이 결정하는 데 도움이 질문을 고려하시기 바랍니다 오직 관계 정보, 예를 들어 모든 외래 키 컬럼?

레일에서는 "개체"테이블 만 모델이됩니다! (특정 유형의 연결에 대해 예외가 있음) 따라서 5 개의 기능 그룹 만 있으면 70 개의 모델이 없을 수 있습니다. 또한 언급 한 기능 그룹이 크게 다를 경우 자체 앱에 가장 적합 할 수도 있습니다.