2009-03-25 8 views
3

J'ai une table de types de service contenant l'identifiant et le nom de quelques dizaines de services.HABTM 2 tables 2 relations différentes

J'ai une table de projets qui doit avoir une liste de services proposés, et une liste de services acceptés.

Je sais que j'utiliserais HABTM des deux côtés avec une table project_service_types entre les deux.

Je n'arrive pas à savoir quoi faire quand j'ai 2 relations différentes entre la même table. Je suppose qu'il utilise le: join_table et: associated_forign_key, mais je ne peux pas le faire fonctionner dans mon application.

merci.

Répondre

4

Alors que vous pouvez résoudre cela avec HABTM, ce dont vous parlez est le cas d'utilisation pour has_many: par. Vous voulez joindre un peu d'information avec la relation. Pour ce faire, créez un modèle de jointure représentant la relation. En fin de compte, cela vous permet de traiter votre proposition de service comme une «chose» de première classe dans votre domaine. Lorsque le service est accepté, vous pouvez simplement changer le statut. Cela enregistre également une jointure.

Migration

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

modèles

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

Pour cela, vous voudrez probablement utiliser has_many: comme par:

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 

Les nombreux à plusieurs section ici:

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

explique cela plus en détail. J'espère que cela t'aides!

5

Je l'ai résolu en utilisant 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

qui ressemble à cela fera l'affaire; la seule chose à savoir est que si vous voulez plus tard avoir des données situées sur l'association elle-même (comme un champ de notes dans le modèle ProjectsProposedTypes), vous voudrez l'option has_many: through détaillée dans ma réponse. Bonne chance pour ton projet! –