이것은 Rails의 단일 테이블 상속을 합법적으로 사용합니까?

StackOverflow https://stackoverflow.com/questions/934758

  •  06-09-2019
  •  | 
  •  

문제

방금 Chad Fowler의 블로그 게시물을 읽었습니다. 20 레일 개발 No-Nos. 단일 테이블 상속에서 그는 다음과 같이 말합니다.

클래스 이름을 보유한 "Type"이라는 열을 저장하는 것은 비린내가 진행되고 있다는 매우 좋은 지표입니다. 비린내이지만 항상 나쁘지는 않습니다. 그러나 나는 당신이 그것을 사용할 때마다 그것이 올바른 솔루션인지 두 번 이상 스스로에게 물어봐야한다고 생각합니다. 데이터베이스는 STI 및 다형성 연관성이 많을 때 최선을 다하지 않습니다.

나는 블로그 응용 프로그램을 작성하고 있으며 게시물에서 작성할 수있는 의견과 방문자가 나와 연락을 원할 경우 게시 할 수있는 연락처 메시지를 위해 STI를 사용하는 것을 고려하고 있습니다. 나의 Message 모델은 내에서 상속됩니다 Comment 모델. 둘 다 그것을 제외하고는 공통 속성을 공유합니다 Message 추가가있을 것입니다 subject 필드. 또 다른 공통점은 둘 다 스팸 점검을 위해 Akismet에 제출된다는 것입니다.

Chad가 제안한 것처럼 올바른 솔루션인지 여부를 두 번 이상 묻지 않고 스택 오버플로 전문가들로부터 의견을 얻을 것이라고 생각했습니다! 내가 제안하는 것은 STI에 적합한 것처럼 들리나요?

도움이 되었습니까?

해결책

나는 Sti를 여러 번 사용했습니다. 페이지, Newsitem, BlogItem 등이있는 CMS를 고려하십시오.

그들은 각각 ActiveRecord에서 상속되는 공통 계급에서 내려갈 수 있습니다. 각각의 테이블은 동일하지만 (제목, 본문, 태그, 게시 된 _at) 각 모델마다 다른 연관성 또는 다른 상태 또는 다른 워크 플로우를 가질 수 있으므로 각각 자체 클래스에 사용자 정의 코드가 있습니다. 그러나 그들은 모두 공통 테이블과 부모 수업을 공유합니다. 또한 상위 클래스를 사용하여 크로스 클래스 검색을 수행하고 결과 레코드 배열이 자동으로 캐스트를 입력 할 수 있습니다.

이것을 다루는 다른 방법이 있고 아마도 가장 좋은 예는 아니지만, 객체 동작이 다를 수 있지만 상태가 동일 할 수있는 상황에 대해 STI가 편리 할 때가 있습니다. 물론 당신은 이것이 미래에도 사실인지 확인해야합니다.

귀하의 경우 주석과 연락처 메시지가 다릅니다. 같은 테이블에 넣어도 이점이없는 것 같습니다. 아마도 학부모 클래스에 공유 코드를 넣거나 /lib의 모듈에 더 나은 코드를 넣을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top