2009-03-25 20 views
3

私は、数十のサービスのIDと名前を含むサービスタイプテーブルを持っています。HABTM 2テーブル2つの異なる関係

私は、Proposed ServicesのリストとAccepted Servicesのリストが必要なProjectsテーブルを持っています。

私は、両側にHABTMを使用し、間にproject_service_typesテーブルを使用することを知っています。

同じ表の間に2つの異なる関係がある場合、私は何をすべきか分かりません。私はそれが:join_tableと:associated_forign_keyを使用すると思うが、私はそれが私のアプリで動作するようになることはできません。

ありがとうございました。そのために

答えて

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

あなたはおそらくにhas_many利用したいと思います。ここでは、多対多のセクション

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オプションを記述したほうがよいでしょう。プロジェクトに幸運を祈る! –

関連する問題