들어가면서 |
안녕하세요. Bucket Place의 게으름뱅이 Cloud Travel입니다. 오늘은 Ruby on Rails에서 제공해주는 다양한 관계 중에서 Polymorphic Associations(다중 연관성)에 대해서 알아보도록 합시다. 일단, 기본적으로 Ruby on Rails에서 제공해주는 일반적인 관계에 대해서 알아봅시다.
- Ruby on Rails 기본제공 관계
관계 이름 |
관계 설명 |
belongs_to |
Foreign Key 관계를 설정할 수 있다. |
has_on |
1:x 관계를 설정할 수 있다. |
has_many |
n:x 관계를 설정할 수 있다. |
has_many :through [model class] |
n:x 관계를 설정하면서 model클래스를 통해서 연결된 다른 정보를 얻어 올 수 있다. |
has_one :through [model_class] |
1:x 관계를 설정하면서 model클래스를 통해서 연결된 다른정보를 얻어 올 수 있다. |
has_and_belongs_to_many |
직접적으로 n:n 관계를 설정해준다. |
Polymorphic Association |
Polymorphic Association을 굳이 한글로 번역하자면 다중 연관성이 될 것이다. 다중연관성, 그 말 그대로 Polymorphic Association은 하나의 모델이 다른 여러개의 모델과 관계를 갖는 상태를 말한다. 예를들어, 다음의 요구사항을 살펴보자.
회원은 자신의 사진을 업로드 한다.
물건을 소개하는 사진을 업로드 한다.
이 관계를 위한 모델을 생성하면 다음과 같이 될 것이다.
이 관계를 알아보면 User_Image와 Product_Image가 담고 있는 정보가 매우 유사하게 된다. 이를 하나로 묶기 위해서 사용하는 것이 Polymorphic Association이다. 하나로 묶은 사진은 아래의 그람과 같이 될 것이다.
여기서 생기는 문제는 어떻게 foreign_id만을 이용해서는 User를 위한 이미지인지, Product를 위한 이미지인지 알 수가 없다. 이를 알기위해서 하나의 정보가 필요한데, 어떤 모델에 관련된 내용인지를 담고 있는 특성도하나 필요하다. 다중 연관성을 위한 완성된 모델은 아래와 같을 것이다.
Ruby on Rails에서의 Polymorphic Associations |
Ruby on Rails에서 다중 연관성을 어떻게 설정할까?
위의 예를 이용하기 위한 Image 모델을 설정생성을 다음과 같이 해주면된다.
class
CreatePictures < ActiveRecord::Migration
def
change
create_table
:pictures
do
|t|
t.string
:name
t.integer
:imageable_id
t.string
:imageable_type
t.timestamps
end
end
end
여기서 foreign_id와 foreign_type에 대해서 특정이름, imageable을 붙여서 만들어 준 것이다.
또한, 각각의 모델에서 설정을 하면 다음과 같이된다.
class
Picture < ActiveRecord::Base
belongs_to
:imageable
, polymorphic:
true
end
class
Employee < ActiveRecord::Base
has_many
:pictures
, as:
:imageable
end
class
Product < ActiveRecord::Base
has_many
:pictures
, as:
:imageable
end
다중 연관성을 위해서 다중 연관을 갖는 모델(위 예에서는 Picture)에 연관관계에 사용할 이름을 belongs_to를 이용하여 정해주고(위 예에서는 imageable), 다중 연관성을 true로 설정을 해준다(polymorphic: ture). 그리고 이와 연결된 모델(위 예에서 Employee, Product)에서는 as를 이용하여 관계와 연결을 시켜준다.
Ruby On Rails의 장점중 하나는 모델을 컨트롤하기 쉽다는 것인데, 여기서도 그 장점은 발휘가 된다. 사용자가 type을 저장하지 않아도, Rails의 자체적인 기능을 이용하여 Type 값을 알아서 넣어준다. 이로 인해서 완벽한 다중 연관성을 만들어 준다.
마무리 |
다중 연관성은 사용한다면 먼가 더 좋아 질 수도 있고 복잡해질 수도 있다. 이에 대해서는 자신의 신념대로 선택하는 것이 좋을 것 같다.
위 글은 http://guides.rubyonrails.org/association_basics.html 페이지를 바탕으로 제작되었습니다.