2010-03-03 2 views
1

다형성 트리 테이블을 배열의 핵심으로 사용하는 콘텐츠 관리 시스템 응용 프로그램이 있습니다. 나는 트리가 꽤 커지면 문제가 생긴다. 우리가 꽤 다른 모듈 (약 25 개)을 가지고 있기 때문에, include => : 인스턴스가 겨자를 자르지 않는다. 인스턴스는 우리의 다형성 관계의 이름입니다.다형성 관계로 열 캐싱

재미있는 점은 대부분이 항목의 큰 목록을 원할 때 (예 : 색인 막대의 목적으로) 연관된 표의 이름이 실제로 필요하다는 것입니다. 나머지는 모두 중앙 테이블. 그래서 나는 아마도 중앙 테이블의 이름에 대해 일종의 컬럼 캐시를 구현해야한다고 생각했다. (레일스가 이미 수행하는 카운터 캐시처럼).

이미 이것을 관리하기위한 플러그인이 있는지 궁금한가요?

그렇지 않은 경우는, 그냥 중앙 테이블에 '이름'열을 추가 거라고 모든 다형성 모델은 슈퍼 클래스를 상속하기 때문에 항목이있을 때마다, 단지 중앙 테이블에 걸쳐 이름을 밀어 콜백을 추가 생성 또는 업데이트되었습니다. 처음에는 채우기 위해 큰 마이그레이션을 수행할까요?

그 디자인에 결함이 있습니까?

필자는 필 요한 경우 나중에 다른 항목을 저장할 수있는 일종의 직렬화 된 캐시 일 수 있다고 생각합니다. 가! : D

답변

0

내 질문에 대답하기 위해 중앙 테이블에 'cached_name'열을 추가하고 'rebuild_cached_name!'을 만들었습니다. 메서드는 모든 레코드를 거쳐 캐시 된 이름을 적절한 값으로 설정합니다. 캐시 열을 만든 마이그레이션에서 재 구축 메서드를 호출했습니다.

그런 다음 내 추상 클래스 (polymorphs가 상속 한 클래스)에서 after_create 메소드를 수정하고 중앙 테이블에서 cached_name을 지정하게했습니다. 또한 일반 이름이 변경 될 때마다 cached_name을 업데이트하는 after_update 메서드 호출을 추가했습니다.

정말 간단하지만 이제는 인덱스 바를 생성하는 것과 같은 간단한 상황에서 더 이상 폴리모프를 호출 할 필요가 없습니다.