2009-03-25 4 views
3

У меня есть таблица типов служб, содержащая идентификатор и имя нескольких десятков сервисов.Таблицы HABTM 2 2 разные отношения

У меня есть таблица проектов, которая должна иметь список предлагаемых услуг и список принятых услуг.

Я знаю, что я бы использовал HABTM с обеих сторон с помощью таблицы project_service_types между ними.

Я не могу понять, что делать, когда у меня есть 2 разных отношения между одной и той же таблицей. Я подозреваю, что он использует: join_table и: associated_forign_key, но я не могу заставить его работать в моем приложении.

спасибо.

ответ

4

В то время как вы можете решить эту проблему с HABTM, о чем вы говорите о том, потребительная случае 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

объясняет это более подробно. Надеюсь это поможет!

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: через параметр, указанный в моем ответе. Удачи с проектом! –

Смежные вопросы