Как мне сделать два отношения has_many / assign_to между двумя моделями? - PullRequest
2 голосов
/ 19 января 2011

У меня есть модель Project и модель Contact.Модель Project имеет владельца и клиента, оба из которых Contact s.У меня, очевидно, происходит что-то неоднозначное, потому что, если у меня есть контакт и я спрашиваю о его проектах, Rails не будет знать, спрашиваю ли я о его проектах, где клиент или владелец.Пока у меня есть это:

class Contact < ActiveRecord::Base
  has_many :projects
end

class Project < ActiveRecord::Base
  belongs_to :owner, :class_name => 'Contact', :foreign_key => 'owner_id'
  belongs_to :client, :class_name => 'Contact', :foreign_key => 'client_id'
end

Как мне установить здесь два отношения?

Ответы [ 3 ]

7 голосов
/ 19 января 2011

Аналогично тому, как belongs_to определено в другом классе.

Так что в принципе

class Contact < ActiveRecord::Base
  has_many :projects_owned, :class_name => "Project", :foreign_key => "owner_id"
  has_many :projects_as_client, :class_name  => "Project", :foreign_key => "client_id"
end

названия ассоциаций могут быть лучше.Описанный выше подход к наследованию одной таблицы также является изящным, но используйте его, если у вас много разных способов поведения для каждого из классов OwnerContact и ClientContact, в противном случае это может быть просто бесполезными издержками.

2 голосов
/ 19 января 2011

Я думаю, здесь должна быть полиморфная ассоциация, что-то вроде этого

class Owner < ActiveRecord::Base
  has_many :projects, :as => :person
end

class Client < ActiveRecord::Base
  has_many :projects, :as => :person
end

class Project < ActiveRecord::Base
  belongs_to :person, :polymorphic => true
end

Теперь вы можете извлекать проекты по @client.projects или @owner.projects.Если вы хотите получить человека из @project, вам нужно добавить в Project миграцию это:

class CreateProjects < ActiveRecord::Migration
  def self.up
    create_table :projects do |t|
      t.references :person, :polymorphic => true
      t.timestamps
    end
  end
  ...
1 голос
/ 19 января 2011

Вы должны попытаться использовать одну таблицу наследования в таблице контактов.Все, что вам нужно сделать, чтобы это работало, это реализовать столбец типа (строка)Рельсы справятся с остальными

class Contact < ActiveRecord::Base
   # implement a type column
   has_many :projects
end

class OwnerContact < Contact
end

class ClientContact < Contact
end

class Project < ActiveRecord::Base
  belongs_to :owner, :class_name => 'OwnerContact'
  belongs_to :client, :class_name => 'ClientContact'
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...