HABTM 2 таблицы 2 разных отношения - PullRequest
3 голосов
/ 25 марта 2009

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

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

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

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

спасибо.

Ответы [ 3 ]

5 голосов
/ 25 марта 2009

Я решил это с помощью 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
4 голосов
/ 25 марта 2009

Хотя вы можете решить эту проблему с помощью habtm, вы говорите о сценарии использования has_many: through. Вы хотите приложить немного информации вместе с отношениями. Для этого вы создаете модель соединения, которая представляет отношение.

В конце концов, это позволяет вам рассматривать ваше предложение по обслуживанию как первоклассную «вещь» в вашем домене. Когда услуга принята, вы можете просто изменить статус. Это также сохраняет соединение.

1006 * Миграция 1007 ** * 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 голосов
/ 25 марта 2009

Для этого вы, вероятно, захотите использовать has_many: through как в:

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

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

...