2010-05-26 7 views
3

가 나는 등 이메일 주소, 성과 이름, 전화 번호와 같은 기본 사용자 정보를 저장하고 싶은 내 앱에서 User 모델이레일 : 관련 모델을 통해 한 모델의 여러 "유형"?

나는 또한에있는 사용자의 많은 다른 유형이 내 판매 대리인, 고객, 손님 등을 포함하는 시스템을 말합니다. 모든 0120-모델을 기본으로 사용하여 모든 필드를 모두 포함 할 필요가 없습니다. 하나 개의 모델에 관련된 역할 및 필요 (중복 데이터베이스 필드 줄이는뿐만 아니라, 다른 한 종류의 하나의 사용자를 변경하는 쉬운 이동성을 제공하는) 위임 할 수 있습니다. 최대 새로운 사용자가 로그인, 나는 (새 사용자가 자동으로 "클라이언트"의 역할을 할당 할 것을 할 때

또한
User 
-- first name 
-- last name 
-- email 
--> is a "client", so 
---- client field 1 
---- client field 2 
---- client field 3 

User 
-- first name 
-- last name 
-- email 
--> is a "sales agent", so 
---- sales agent field 1 
---- sales agent field 2 
---- sales agent field 3 

and so on... 

, 난 :

그래서, 내가 원하는 것은 이것이다 권한이 아니라 데이터베이스 필드에 대해 이야기하고 있지만, 결국이 논리를 내 사용자 권한에도 포함시키기를 바랍니다). wizardly으로 구축하려고하는 다중 단계 가입 마법사가 있습니다. 첫 번째 단계는 간단합니다. 기본 모델 User (예 : first_nameemail)에 포함 된 필드를 호출하기 만하므로 두 번째 단계는 관련 모델에서 필드를 호출해야하므로 까다 롭습니다 (예 : per 내 위의 예 - 필드 client_field_1 또는 client_field_2와 모델 client, 그 필드) User의 일부인 것처럼.

의미가 있습니까? 그것이 명확하지 않다는 것을 알려주고, 다른 방식으로 설명하려고 노력할 것입니다.

아무도 도와 줄 수 있습니까? 어떻게하면 좋을까요? 여기에 두 가지 합리적인 접근 방식을 가지고있는 것처럼

답변

1

그것은 보이지만, 그것은 당신의 요구 사항의 미묘한 차이에 따라 달라집니다.

당신은 사용자가 등 SalesAgent라는 이름의 다른 사람 또는 클라이언트와 만 기본 클래스입니다 당신이 원하는 일을하는 단일 테이블 상속 (STI)를 사용할 수 있습니다

. 이러한 각 하위 클래스는 고유 한 유효성 검사를 정의 할 수 있습니다. 당신이 작업이 필요한 모든 "유형"이라는 문자열 컬럼과 액티브가 나머지를 할 것입니다 : 대체하면 관련 데이터의 여러 비트를 저장 자유 양식 필드의 숫자를 가지고있다

class User < ActiveRecord::Base 
end 

class Agent < User 
end 

및 단순히 실행시에 다르게 해석하십시오.

class User < ActiveRecord::Base 
    has_one :agent_role, 
    :dependent => :destroy 
end 

class AgentRole < ActiveRecord::Base 
    belongs_to :user 

    # Represents the agent-specific role fields 
end 

이렇게하면 여러 역할을 허용하고 has_many를 사용하면 같은 유형의 여러 역할을 사용할 수 있다는 장점이 있습니다.

+0

STI가 내가 찾고있는 것 같아요. 나는 그것과 함께 실험하고 그것이 맞는지 보겠다. 설명 : 비록 후자의 방법이 "여러 역할을 허용하는 이점"을 가지고 있다고 말할 때 ... 여기서 정확히 무엇을 의미합니까? 'Class Agent neezer

+0

추가 조사에서 다형성 협회 (Polymorphic Association)가 저에게 더 적합 할 것으로 보입니다. 이 기사를보십시오 : http://www.andygoh.net/2008/06/19/ruby-on-rails-polymorphic-association/ 아직도 실제로 이러한 연관성을 사용하여 주위에 머리를 감싸는 데 문제가 있습니다 ... 불행히도, Ryan Bate 's 주제에 대한 스크린 캐스트는 내가 성취하고자하는 목표와 거의 정반대입니다 (다른 모델에 속하는 모델을 가지고 있지만 다른 모델이 많은 모델을 원합니다) ...? – neezer

+0

여러 역할 주석의 의미는 단일 사용자가 여러 역할을 가질 수있는 반면 STI는 사용자가 단일 역할을 맡는 것입니다. 다형성 연결은 상황에 따라 적절할 수 있지만 외래 키 제약 조건을 적용하는 것이 불가능하고 항상 조인 키가 필요하기 때문에 데이터베이스 디자인의 경계에 남겨 두는 것이 가장 좋습니다. 중핵의 부분은 성가신 일 수있다. 유형 정보가 DB가 아닌 ORM에만 관련되기 때문에 STI는 "데이터베이스 친화적"입니다. – tadman

3

ActiveRecord (Rails 3에서 ORM을 변경하기 쉽습니다)를 사용하는 경우 tadman에서 제안한대로 STI가 요구 사항에 적합 할 수 있습니다. 기본 정보는 AR documentation page 볼 수 있지만, 여기에 몇 가지 추가 정보 w.r.t.입니다 타겟 :

  • 파일 당 하나의 모델을 정의하십시오. 그렇지 않으면 몇 가지 초기화 문제가 있습니다. 클라이언트가 단일 파일에서 User를 모두 상속한다고 가정하면 User 생성자가 한 번 호출되지 않는 한 Client 객체를 만들 수 없습니다. 모델 당 하나의 파일로 문제가 해결됩니다.
  • 계층을 통한 모든 속성은 최상위 클래스에서 한 번만 정의됩니다. 이것은 성능 문제이지만 블로그 게시물에 많은 사람들을 방해하고있는 것처럼 보입니다. 즉, Ruby 코드는 객체 지향적이며 속성을 적절히 캡슐화합니다. DB에는 하나의 테이블에 모든 항목이 포함되어 있으며 계층 구조에 속하는 위치를 구별 할 수있는 추가 "유형"열이 있습니다. 이것은 관계형 데이터베이스의 상속 트리를 나타내는 "트릭"일뿐입니다. 우리는 ORM 매핑이 간단하지 않다는 것을 알아야합니다. image on this site from Martin Fowler은 상황을 이해하는 데 도움이 될 수 있습니다.

또한 새로운 사용자가 Client가되고 User는 Client를 상속받습니다. 이렇게하려면 새 사용자를 클라이언트로 인스턴스화하면됩니다. 사용자 생성 컨트롤러 :

user = Client.new 
# Do something to user 
user.save 
#=> <Client id: 1, name: "Michael Bolton", email: "[email protected]", created_at: "2010-05-30 03:27:39", updated_at: "2010-05-30 03:27:39"> 

위의 내용은 ActiveRecords를 사용할 때 레일스 3에서 유효합니다.

+0

파일 당 one-model 규칙 주위에 어떤 방법이 있습니까? 상속 된 모델이 많이 있는데, 나는 그들 모두를위한 파일을 만들고 싶지 않습니다 ... – Alistair

관련 문제