2010-07-15 3 views
0

이것은 매우 간단한 질문이지만 실제로 Person의 모델을 작성한다고 가정 해 보겠습니다. 사람은 분명히 이름, 성, 나이 등을 가지고 있지만 그 사람은 또한 주소 1, 주소 2, 도시, 주, 우편 번호, 국가, 전화 1, 전화 2 등과 같은 것들로 구성된 연락처 정보를 가지고 있습니다 ...Ruby on Rails/Activerecord mySQL 모델링

Person의 모델을 만든 다음 해당 연락처 정보를 모델의 테이블로 표시하거나 ContactInfo (또는 Address 등) 모델을 만든 다음 Person을 ContactInfo에 연결할 수 있습니다. 협회 (Person has_one ContactInfo/Person has_one 주소/주소 belongs_to Person, etc.)?

이러한 방법 중 어느 것이 더 나은 방법이며 각 방법의 장점/단점은 무엇입니까?

편집 :이 방법 그래서

.. J에 다시에, 나는 다음 주소 지정 모델을 만드는 것?

script/generate model Addressable 

class Addressable < ActiveRecord::Base 
    #stuff here? 
end 

이 필요하지 않습니까?

또한, 나는 create_users.rb이 줄을 추가해야합니다 :

t.references :addressable, :polymorphic => true 

내가 모르는 뭔가가있어 같은 느낌,하지만 나는 확실히 어떤 아니에요. 도와 주셔서 감사합니다. 톤, btw! 감사!

+0

방금 ​​답변을 업데이트했습니다 :] –

답변

2

나는 주소, 전화 및 물건에 대해 분리 된 테이블/모델을 만들어 이와 같이 만들 것이다. polymorphic. 이처럼 :

class Address < ActiveRecord::Base 
    belongs_to :addressable, :polymorphic => true 
end 

class Person < ActiveRecord::Base 
    has_one :address, :as => :addressable 
end 

나는 이것이 나중에, 예를 들어, 회사 모델을 추가 할 수 있기 때문에 가장 좋은 방법이라고 생각하고 그것을 addressable 쉽게 만들 수 있습니다. address는 예를 들어, 당신이 Address 모델,하지 Addressable 필요 했어 사용

편집

.

그리고 당신은 당신이 addresses 테이블에 addressable_idaddressable_type을해야하므로,

t.references :addressable, :polymorphic => true 

또는

t.belongs_to :addressable, :polymorphic => true 

당신의 create_addresses 마이그레이션에 추가해야합니다. ]

+0

도움을 주셔서 감사합니다! 내가 준 정보를 반영하도록 내 질문을 업데이트했습니다. –

1

대답은 위의 의미가 있습니다,하지만 당신이 필요로 얼마나 많은 기록이 관리 할 필요가 얼마나 많은 분야에 대해 생각 :

는 다른 의심이 있으면 알려주세요. 각 추가 필드에 대한 테이블을 작성하는 것은 너무 많은 노력 일 수 있습니다.

또 다른 방법은 뭔가 더 유연 수 : 3 개 필드 (말하자면 person_details을) 테이블을 만들 : person_id로 : 정수, FIELD_NAME : 문자열, field_data : 문자열, 다음 모델 :

class PersonDetail < ActiveRecord::Base 
    belongs_to :person 
end 

이 방법으로 당신에게 필요한 추가 필드를 추가 할 수 있습니다 : phone1 ..phoneN, address1..addressN 등.

class PersonDetail < ActiveRecord::Base 
    belongs_to :person 

    FIELD_NAMES => { 'Address' => 1, 'Phone' => 2) 
end 

을이 경우는의 값을 저장하기 때문에 당신이 (정수로 FIELD_NAME를 선언합니다 :

다른 유사한 접근 방식은 삽입시 다른 레이블을 방지하기 위해, 필드 이름을 미리 결정하는 것입니다 해시가 아닌 문자열).