Rails의 many to many(다대다) 의 복합키 설정하는법
구조는 간단하게 권한(permissions ) 과 역할(roles)가 다대다 관계를 맺게될때
중간테이블을 만들어 데이터를 저장하게 설계했는데,
복합키 설정이 다소 생뚱맞아(삽질 했으므로) 적어둔다.
gem ‘composite_primary_keys’ 가 필요하다!
검색해보니 일반적인 rails 규칙으로는 안된다고 하여,
편법(?)으로 gem을 추가 하여 복합키를 만든다고들 한다.
Gemfile 에 추가해야할 사항
. . gem 'composite_primary_keys', '~> 8.0.0' .
현재 환경은 rails 4 이다. rails 버전에 따라 gem 버전도 달라질수 잇으므로 주의
그리고
bundle install
model, migrate file소스를 수정
기본 뼈대를 만들고
rails g scaffold permission name:string description:string rails g scaffold role name:string description:string rails g model permission_role permission:references role:references
생성된 migrate 파일을 약간수정
class CreatePermissionRoles < ActiveRecord::Migration def change create_table :permission_roles, id: false do |t| t.references :permission, foreign_key: true, null: false t.references :role, foreign_key: true, null: false end add_index :permission_roles, [ :permission_id, :role_id ], unique: true end end
중간테이블로서의 역활만 충실히 하기에 기본 생성되는
id 및 create_dt, update_dt 전부 제거
모델 수정
# role.rb class Role < ActiveRecord::Base has_many :permission_roles, :dependent => :delete_all has_many :permissions, :through => :permission_roles end # permission.rb class Permission < ActiveRecord::Base has_many :permission_roles, :dependent => :delete_all has_many :roles, :through => :permission_roles end #permission_role.rb class PermissionRole < ActiveRecord::Base self.primary_keys = :permission_id, :role_id belongs_to :permission belongs_to :role end
관계설정까지 다해주면
rake db:migrate
끝~
No Comments