2011-01-18 3 views
2

Project 모델과 Contact 모델이 있습니다. 프로젝트 모델에는 소유자와 클라이언트가 있으며 두 모델 모두 Contact입니다. 난 분명히 모호한 것을 가지고 있습니다. 왜냐하면 내가 연락을하고 프로젝트를 요청하면 Rails는 내가 클라이언트인지 또는 소유자인지 여부를 묻는 것입니다. 지금까지 나는 이것을 가지고 있습니다 :두 모델간에 has_many/belongs_to 관계를 두 개 수행하려면 어떻게해야합니까?

여기에 두 개의 관계를 어떻게 만듭니 까?

답변

7

belongs_to은 다른 클래스에서 정의 된 것과 유사합니다.

그래서 기본적으로 협회의

class Contact < ActiveRecord::Base 
    has_many :projects_owned, :class_name => "Project", :foreign_key => "owner_id" 
    has_many :projects_as_client, :class_name => "Project", :foreign_key => "client_id" 
end 

이름이 더 좋을 수 있습니다. 앞에서 설명한 Single Table 상속 접근법은 또한 깔끔한 방법이지만, OwnerContact 및 ClientContact 클래스 각각에 대해 서로 다른 동작을 많이하는 경우에는 사용하십시오. 그렇지 않으면 쓸모없는 오버 헤드 일 수 있습니다. 내가 여기 생각

+0

그것은 정확히 내가 필요로하는 것, 감사 Rishav이다! – Skilldrick

1

Contact 테이블에서 단일 테이블 상속을 사용해보십시오. 이 작업을 위해 필요한 것은 '유형'열 (문자열)을 구현하는 것입니다. 레일은 나머지를 처리합니다

class Contact < ActiveRecord::Base 
    # implement a type column 
    has_many :projects 
end 

class OwnerContact < Contact 
end 

class ClientContact < Contact 
end 

class Project < ActiveRecord::Base 
    belongs_to :owner, :class_name => 'OwnerContact' 
    belongs_to :client, :class_name => 'ClientContact' 
end 
+0

일부 연락처는 소유자 * 및 * 클라이언트 일 수 있습니다. 나는 이것이 모델링에 대한 문제를 더 지적 할 것 같다고 생각한다. – Skilldrick

2

는 다형성 협회, 이제 @client.projects 또는 @owner.projects으로 프로젝트를 검색 할 수 있습니다이

class Owner < ActiveRecord::Base 
    has_many :projects, :as => :person 
end 

class Client < ActiveRecord::Base 
    has_many :projects, :as => :person 
end 

class Project < ActiveRecord::Base 
    belongs_to :person, :polymorphic => true 
end 

과 같이해야합니다. @project에서 사람을 얻으려면 다음과 같이 프로젝트 이전에 추가해야합니다.

class CreateProjects < ActiveRecord::Migration 
    def self.up 
    create_table :projects do |t| 
     t.references :person, :polymorphic => true 
     t.timestamps 
    end 
    end 
    ... 
+0

tusharr의 제안과 마찬가지로 소유자와 클라이언트가 같은 사람 일 수 있습니다. 두 개의 별도 레코드가 필요하지 않습니다. – Skilldrick

+0

Person에 부울 속성을 추가하고 owner와 같은 메서드를 만드는 것만으로도 문제가되지 않습니까? 및 클라이언트? ? – megas

관련 문제