2009-03-25 4 views
3

ID가 포함 된 서비스 유형 테이블과 몇 가지 서비스가 있습니다.HABTM 2 테이블 2 개의 서로 다른 관계

나는 Proposed Services 목록과 Accepted Services 목록을 가지고있는 Projects 테이블을 가지고 있습니다.

사이에 project_service_types 테이블이있는 HABTM을 사용할 것을 알고 있습니다.

동일한 테이블 사이에 2 개의 다른 관계가있을 때 어떻게해야하는지 알 수 없습니다. 나는 그것이 : join_table 및 : associated_forign_key를 사용하는 것으로 의심하지만, 내 애플 리케이션에서 작동하도록 할 수 없습니다.

감사합니다. 같이 통해 : 당신은 아마 has_many 사용할 거라고 들어

답변

4

는 당신이에 대해 얘기하는 것은 has_many에 대한 사용 사례입니다. 당신은 관계와 함께 약간의 정보를 첨부하고 싶습니다. 이를 수행하려면 관계를 나타내는 조인 모델을 작성하십시오.

결국 서비스 제안서를 도메인의 일류 "물건"으로 취급 할 수 있습니다. 서비스가 승인되면 상태를 변경할 수 있습니다. 또한 조인을 저장합니다.

마이그레이션

create_table :project_services do |t| 
    t.references :project 
    t.references :service_type 
    t.string :status 
end 

모델이 트릭을 할 것 같다

class ProjectService < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :service 
end 

class Project < ActiveRecord::Base 
    has_many :project_services 
    has_many :accepted_services, :through => :project_services, 
    :conditions => { :status => 'accepted' } 
    has_many :proposed_services, :through => :proposed_services, 
    :conditions => { :status => 'proposed' } 
end 

class Service < ActiveRecord::Base 
    has_many :project_services 
    has_many :accepted_projects, :through => :project_services, 
    :conditions => { :status => 'accepted' } 
    has_many :proposed_projects, :through => :proposed_services, 
    :conditions => { :status => 'proposed' } 
end 
3

class ProposedService < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :service_type 

class AcceptedService < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :service_type 

class Projects < ActiveRecord::Base 
    has_many :proposed_services 
    has_many :accepted_services 
    has_many :service_types, :through => :proposed_services 
    has_many :service_types, :through => :accepted_services 

class ServiceTypes < ActiveRecord::Base 
    has_many :proposed_services 
    has_many :accepted_services 
    has_many :projects, :through => :proposed_services 
    has_many :projects, :through => :accepted_services 

많은 - 투 - 많은 여기 섹션 :

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

더 자세하게 설명합니다. 희망이 도움이! 를 통해 : 당신이 HABTM와 함께이 문제를 해결 할 수 있지만

5

내가 HABTM를 사용하여 해결 ...

class ServiceType < ActiveRecord::Base 
    has_and_belongs_to_many :accepted_projects, :class_name => "Project", :join_table => :projects_accepted_types 
    has_and_belongs_to_many :proposed_projects, :class_name => "Project", :join_table => :projects_proposed_types 
end 

class Project < ActiveRecord::Base 
    has_and_belongs_to_many :accepted_types, :class_name => "ServiceType", :join_table => :projects_accepted_types 
    has_and_belongs_to_many :proposed_types, :class_name => "ServiceType", :join_table => :projects_proposed_types 
end 
+0

; 알고 있어야하는 유일한 점은 나중에 데이터를 연관 자체 (ProjectsProposedTypes 모델의 메모 필드와 같은)에두고 싶다면 has_many : through 옵션을 내 대답에 자세히 설명하는 것입니다. 프로젝트와 함께 행운을 빌어 요! –

관련 문제