Вопрос

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

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

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

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

Спасибо.

Это было полезно?

Решение

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

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

Миграция

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

Другие советы

Я решил это с помощью 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

Для этого вы, вероятно, захотите использовать 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top