2010-04-21 7 views
1

내가 지금 여기, 데이터베이스에는 전문가와 레일에서 초보자는 아니지만 내가 샘플로 세 개의 클래스를 가정하면 좀 나를 혼란 뭔가 ...데이터베이스 중첩 모델 레이아웃 혼란

간다 (노력이없는 점에 유의 이 샘플에서 Rails 예약어 문제를 해결할 수 있도록 만들어졌습니다.)

class File < ActiveRecord::Base 
    has_many :records, :dependent => :destroy 
    accepts_nested_attributes_for :records, :allow_destroy => true 
end 

class Record < ActiveRecord::Base 
    belongs_to :file 
    has_many :users, :dependent => :destroy 
    accepts_nested_attributes_for :users, :allow_destroy => true 
end 

class User < ActiveRecord::Base 
    belongs_to :record 
end 

레코드를 입력하면 데이터베이스 내용이 그대로 표시됩니다. 내 문제는 동일한 레코드에 대해 많은 파일이있는 경우 중복되는 레코드 이름이 있다는 것입니다. 사용자 테이블에 동일한 사용자에 대한 레코드가 여러 개있을 경우에도 마찬가지입니다.

하나 이상의 파일이 하나의 레코드 항목을 가리키고 하나 이상의 레코드가 단일 사용자를 가리 키도록 이보다 더 좋은 방법이 있는지 궁금합니다. BTW, 파일 이름은 고유합니다.

파일 테이블 :

id name  
1 name1  
2 name2  
3 name3 
4 name4 

기록 테이블 :

id file_id record_name record_type 
1 1  ForDaisy1 ...  
2 2  ForDonald1 ... 
3 3  ForDonald2 ... 
4 4  ForDaisy1 ...  

사용자 테이블 :

id record_id username 
1 1   Daisy  
2 2   Donald  
3 3   Donald 
4 4   Daisy 

이 항목의 중복을 방지하기 위해 데이터베이스를 최적화 할 수있는 방법이 있나요, 또는 정말로 정확하고 적절한 행동이어야합니다. 나는 미래에 새로운 컬럼을 쉽게 추가 할 수 있도록 데이터베이스를 여러 테이블에 분산시켰다.

답변

1

나는 has_many와 belongs_to가 의미하는 것을 오해했다고 생각합니다. 사용자는 많은 레코드를 가지고 있으며 레코드에는 많은 파일이 있습니다. 사용자가 레코드에 속하지 않으므로 의미가 없습니다. 그러니 당신의 관계를 돌아서 당신이 원하는 것을 얻는다고 생각합니다.

당신은 얻을 것이다 :

(File, id, record_id, name) 
(Record, id, user_id, name, ...) 
(User, name, ...) 

class File < ActiveRecord::Base 
    belongs_to :record 
end 

class Record < ActiveRecord::Base 
    belongs_to :user 
    has_many :files 
end 

class User < ActiveRecord::Base 
    has_many :records 
    has_many :files, :through => :records 
end