2013-04-08 1 views
0

는 내가 관리자 및 개발자 각각 (공통 인증 메커니즘에 대한) 사용자가 다형성 협회,다형성 협회 식별자, has_one 및

Developer.rb

class Developer < ActiveRecord::Base 
    attr_accessible :skype_name 
    has_one :user, :as => :profile, :dependent => :destroy 
    accepts_nested_attributes_for :user 
end 

이 고유성 Admin.rb이 동일하지만, 새로운 속성

를 추가하지 않습니다 User.rb

class User < ActiveRecord::Base 
    attr_accessible :email, :name, :password, :password_confirmation, :profile_id, :profile_type 
    has_secure_password 

    belongs_to :profile, :polymorphic => true 
    before_save { |user| user.email = email.downcase } 

    ... some validations for unique email and before_save stuff ... 
end 

레일 콘솔을 통해 개발자 또는 관리자를 만들면 User.profile_id는 항상 고유하며 개발자 또는 관리자와 동일합니다. 이 Developer.find(u.profile_id)를 호출하여 참조를 얻을 안전 및 유사 관리자입니다, 또한 내가 profile_type = Developer와 사용자가있는 경우도 here

과 일치하는 것, 그리고 나는 개발자에 대한 참조를 얻으려면? 그리고 그렇지 않다면 어떻게 안전하게 할 수 있습니까?

그것은 현재 작동하지만 테이블이 작기 때문에 운이 좋은 것인지 확실하지 않습니다.

+0

예 찾아야한다. 빠른 대답은'profile type'을 "Developer"로 설정했기 때문에, User'profile id'는'Developer' 테이블에있는 프로파일 아이디와 일치해야한다는 것입니다. – jason328

+0

나는이 railscast에서'find_commentable' 메소드를 왜 정의했는지 혼란 스럽습니다. http://railscasts.com/episodes/154-polymorphic-association. (이 방법은 'notes'섹션에서 볼 수 있습니다.) –

답변

1

예. 빠른 대답은 프로필 유형을 "개발자"로 설정했기 때문에 사용자 프로필 ID가 개발자 테이블의 프로필과 일치해야한다는 것입니다. 레일 당신을 위해 모든 일을 처리, 당신은 다형성 연결을 설정하기 때문에이

사용자 한

id: 1 
name: Bob 
profile_type: Developer 
profile_id: 1 

사용자 두

id: 2 
name: Shelly 
profile_type: Admin 
profile_id: 1 

가지고 잠시 상상해보십시오. ID 충돌에 대해 걱정할 필요가 없습니다. 물론 당신이

업데이트 된 사용자에 사용자 두를 변경하지 않는 한 두

id: 2 
name: Shelly 
profile_type: Developer 
profile_id: 1 

그런 다음 레일은 두 사용자가 같은 개발자의 때 무엇을해야할지 알 수 없습니다.

그리고 개발자와 관리자의 테이블 내

당신은

개발자 표

id: 1 
skype_name Bob123 

관리자의 표

id: 1 
skype_name Shelly78 
+0

프로필 테이블의 고유 키는 profile_type과 profile_id의 조합입니까? 물론 사용자 ID가 모두 같을 수는 없습니까? –

+0

예, profile_type은 Rails가 개발자 테이블 또는 사용자 테이블의 Admin 테이블에서 사용자 연관을 찾도록 지시합니다.profile_type을 사용하여 개발자 또는 관리자 등을위한 작업을 지정하는 몇 가지 sortof if/else 문을 설정할 수도 있습니다. 후자의 질문을 명확히 할 수 있습니까? 귀하의 예에서 – jason328

+0

, 첫 번째로 나열된 속성은 "id : 1"이지만 모두 1입니다. User 테이블의 핵심은 그렇지 않습니까? 반드시 고유해야합니다. –