2015-05-08 5 views
0

ПРЕДПОСЫЛКА: Я мысленно концептуально о том, как ссылаться на один объект, который может принадлежать более чем одной модели. Например, если у меня есть модель «Школа и работодатель», пользователь может теоретически посещать и работать в той же школе. В идеале оба отношения указывают на один и тот же объект.Объект с более чем одной моделью (Rails)

ВОПРОС: Как бы я смоделировал это в приложении Rails, основанном на postgresql?

UPDATE В этом случае, я был бы нужен, чтобы пользователь мог иметь как один или несколько школ и одного или нескольких работодателей.

+0

Не рельсовый парень, но разве у вас нет модели пользователя с двумя свойствами с обоими школьными моделями? –

+1

Как связаны школа и работодатель? –

+0

@sean В том, как я об этом думаю, они не связаны друг с другом, за исключением того, что один объект может одновременно быть как Школой, так и Работодателем. – neon

ответ

1

Для этого у вас будет три модели: пользователь, школа и работодатель.

Пользователь belongs_to 1 Школа и belongs_to один работодатель. Школа has_many Пользователи. Работодатель has_many Пользователи.

Зная эти отношения, которые используются непосредственно в ваших моделях, вы теперь знаете, что Пользователь будет иметь атрибут school_id и employer_id. Ни школа, ни работодатель не будут иметь user_id.

Если вы решили спуститься по маршруту пользователей, имеющих и принадлежащих ко многим школам или работодателям (has_and_belongs_to_many), вам нужно будет посмотреть документацию ActiveRecord на таблицы соединений.

2

EDIT: Для того, чтобы отразить, что речь шла о HABTM

Вы бы использовать что-то вроде этого, если вы хотите, чтобы иметь возможность использовать ту же самую точную запись как для работодателя и школы в User.employer. Я предполагаю, что у пользователя может быть только одна школа и один работодатель, не более того.

class School < ActiveRecord::Base 
    has_many :employees, as: :employable 
    has_and_belongs_to_many :students, class_name: "User" 
end 

class Business < ActiveRecord::Base 
    has_many :employees, as: :employable 
end 

class Contract < ActiveRecord::Base #This object models the relationship between User and Employer 
    belongs_to :employer, as: :employable, polymorphic: true 
    belongs_to :user 


class User < ActiveRecord::Base 
    has_and_belongs_to_many :schools 
    has_many :contracts 
    has_many :employers, through: :contracts 
end 

это было бы настроить его так, что, если вы звоните User.school он будет возвращать объект школы, но если вы звоните User.employer он может пойти либо школы или работодателя в зависимости от точек какого пользователя.

Используется Polymorphic Associations. Пожалуйста, прочитайте о них, поскольку Миграции отличаются для такого рода ассоциаций.

Причина, по которой мы используем объект Contract, состоит в том, что ассоциация has_and_belongs_to_many не может быть полиморфной, поэтому мы вручную ее рулон. Если вам не нравится has_and_belongs_to_many или вам нужна дополнительная гибкость для отношений School, вы можете использовать промежуточный объект, например, для работодателя, возможно, он называется Tuition.

+0

Только добавление, которое я добавил бы, касается случая пользователя, у которого нет школы или нет работодателя. –

+2

Этот случай вообще не изменяет требуемый код?Работодатель и школа будут нулевыми, вот и все. – Mario

+0

Извините, что не указали - в этом случае мне нужен пользователь, чтобы иметь как одну, так и более Школы и одно или несколько Работодателей – neon

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