polymorphic이란
Article와 Event 모델에 각각 커맨트기능을 추가한다고 가정해봅시다.
각각에 기사용 커맨트 테이블과 이벤트용 커맨트 테이블을 만들게 되면 똑같은 처리를 두번 정의해야 되므로 Rails 의 DRY정신에 위배됩니다.
그래서 커맨트 테이블을 하나만 만들고 Article과Event모델에서 공동 사용하는형식을 띄게 만드는것이 폴리모픽 관계입니다.
실제로 만들어봅시다.
프로젝트 작성
모델&테이블 작성
Event모델/테이블 작성
Article모델/테이블 작성
마지막으로 Comment모델/테이블 작성
※필수적으로 참조할 외부키와 모델명의 정보를 넣어줄 xxx_id
와xxx_type
컬럼이 필요합니다.
인덱스설정도 추가해줍니다.
모델에 has_many와belongs_to추가
belogns_to
과polymorphic
옵션을 사용해서 기술합니다.
디폴트로 belongs_to
에 지정한 xx
가 xx_id
xx_type
의 xx
가됩니다.(class_name
이나foreign_key
옵션으로 변경도 가능)
xx
에 commentable
을 넣으면 해당 모델의 컬럼에 commentable_id
와commentable_type
가 없으면 에러가 나게됩니다.
Event,Article모델에는 has_many와as옵션을 이용해줍니다.
comment모델에서 belongs_to :commentable
이라고 선언해줬으므로 as: :xxx
의xxx
에commentable
를 넣어줍니다.
사용가능해진 커맨드 일람
폴리모픽 관계 설정을 해주면 Comment테이블이 작성될떄 자동적으로 commentable_id
와commentable_type
에 해당 모델정보가 들어가는게 보입니다.
Article에서도Event에서도 같은 방식으로 comment모델에 접근하는것을 알 수 있습니다.
폴리모픽관계시 화면작성
덤으로 폴리모픽 관계설정시 Comments컨트롤러의 작성방법을 소개합니다.
이하와같은 루트 설정일 경우 커맨트 컨트롤에서 동적으로 Article클래스인지 Event클래스인지 판단할 필요가 있습니다.
load_commentable메소드 안에서 리퀘스트의 URL에서 Article인지 Event인지 판별하고 폴리모픽 관계에 맞춰서 동적으로 모델을 읽어오는 형식입니다.