Bucket Place/Ruby on Rails

[Ruby on Rails] Polymorphic Associations (다중 연관성)

Cloud Travel 2014. 5. 23. 13:25


  들어가면서 


 안녕하세요. 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 페이지를 바탕으로 제작되었습니다.