1

a rails новичок здесь, глядя на работу с 4 таблицами и не полностью уверен, как структурировать ассоциации. Ниже тема связана с недвижимостью, возможно, полезно помнить об этом.Rails - ассоциации с четырьмя столами -

У меня есть четыре модели:

  • собственность - физический дом
  • проекта - большая группа рабочих мест, происходящих в доме
  • Работы - конкретная работа в доме
  • Worker - лицо, выполняющее работу

Ассоциации, поскольку я их вижу в голове:

  • Свойство может иметь множество проектов, рабочие места и рабочие
  • одного проект принадлежит одному собственности, но может иметь много рабочих мест и (с помощью рабочих мест) имеют много работников
  • один Работа принадлежит к одному проекту и одной собственности (через Project), но может иметь много работников
  • один работник может иметь одну работу на одном проекты на одном собственности

Мои два вопроса:

  1. Каков наилучший способ подумать о вышеупомянутом наборе отношений?

  2. ** Как мне создать ассоциации между моими моделями? Не могу заставить мою голову обмотать, как это сделать.

Действительно ценить любые мысли!

***** ОБНОВЛЕНО модельная структура - 9/30/2015 Благодаря Джейсон - вот что у меня есть сейчас (ниже)

Моя основная цель в работе с данными будут следующие: - перечислите имущество, его проекты, рабочие места и работники - перечислите набор проектов и свойств для рабочего

Выполняет ли приведенная ниже модель структура выше? Мне кажется, по моему мнению, но не может быть абсолютно уверен.

установки модели в 9/30

  • недвижимости Модель has_many: проекты has_many: рабочие места, через:: проекты has_many: рабочие, через:: вакансии

  • Модель проекта belongs_to : имущество has_many: вакансии has_many: работники, через:: вакансии

  • Работа Модель belongs_to: проект has_many: рабочие

  • работник Модель has_many: работа

+0

Ознакомьтесь с http://guides.rubyonrails.org/association_basics.html. Там вы узнаете о различных типах ассоциаций, когда использовать их и как их настроить. – IngoAlbers

+0

Спасибо Эгон, да, я видел это раньше. Все это «имеет смысл», когда я читаю его, но потом, когда я пытаюсь это сделать, почему-то все превращается в беспорядок ... – Anthony

ответ

1

Чтобы уточнить, я думаю, что у вас есть это: свойство может иметь много проектов. Каждый проект принадлежит одному свойству и может иметь много рабочих мест. Каждая работа принадлежит одному проекту и может иметь много работников. Каждый работник принадлежит к одной работе.

Property Модель:

has_many :projects 

Project Модель:

belongs_to :property 
has_many :jobs 

Job Модель:

belongs_to :project 
has_many :workers 

Worker Модель:

belongs_to :job 

Каждый project должен иметь property_id, каждый job должен иметь project_id и каждый работник должен иметь job_id. Они могут быть установлены в вашей миграции (с помощью функции belongs_to), где вы создаете таблицы для этих моделей. Они будут выглядеть следующим образом:

create_table :projects do |t| 
    t.belongs_to :property, index: true 
    . 
    . # your other attribute(s) here 
    . 
end 

Это даст Project моделирует атрибут property_id, что позволяет получить доступ к Project «ы Property.

Edit:

Если вы хотите, чтобы легко получить доступ ко всем рабочим свойство и все работникам проекта, вы можете добавить has_manythrough ассоциации с каждой из моделей Property и Project. Кроме того, вы можете добавить еще одну ассоциацию к модели Property, которая позволит вам получить доступ ко всем заданиям свойств.Они будут выглядеть следующим образом:

Property модель дополнение:

has_many :jobs, through: :projects 
has_many :workers, through: :projects 

Project модель дополнение:

has_many :workers, through: :jobs 

Edit: (OP осветленного нужной схема модель)

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

Есть два варианта этой работы для рабочего отношения: has_and_belongs_to_many и has_manythrough. Ключевое различие между этими параметрами заключается в том, что каждая запись в таблице соединения has_and_belongs_to_many устанавливает связь между заданием и рабочим и не требует модели, но таблица соединения может содержать дополнительную информацию об этой связи. Эта дополнительная информация будет доступна через отдельную модель. Этот второй вариант мог бы, например, быть полезным для отслеживания количества часов, в течение которого рабочий регистрировался на каждом задании. Here - более подробное описание разницы между этими параметрами.

Если вы уже создали модели Worker и Job, вы должны создать новую миграцию для создания этой таблицы соединений. В противном случае вы можете включить в файл миграции следующие create_table для моделей Worker или Job.

Вот код миграции для has_and_belongs_to_many ассоциации:

def change 
    create_table :jobs_workers do |t| 
    t.belongs_to :job, index: true 
    t.belongs_to :worker, index: true 
    end 
end 

В Job модели, избавиться от этого:

has_many :workers 

и заменить его следующим образом:

has_and_belongs_to_many :workers 

В модели Worker, избавься от этого:

belongs_to :job 

и заменить его следующим образом:

has_and_belongs_to_many :jobs 

Объяснение has_manythrough ассоциации будет более длительным, так что я буду отложить до this page.

+0

Привет, Джейсон, действительно очень ценю ваши мысли здесь. Комментарий/вопросы ... 1) в моем случае работник будет принадлежать только 1 заданию 2) в приведенном выше «добавлении модели собственности» ...это: has_many: рабочие места, через:: проекты has_many: рабочие, через:: проекты - или - has_many: рабочие места, через:: проекты has_many: рабочие, через:: вакансии Отметьте 2-я строка «через:: проекты» против «через:: jobs» Аналогичным образом, могу ли я найти список свойств через 1 работника таким образом? – Anthony

+1

Любой из них позволит вам получить доступ ко всем рабочим, связанным с свойством. Я смущен в последней части вашего комментария, хотя, где вы спрашиваете, можете ли вы «найти список свойств через 1 рабочего». Я думал, что рабочий, работающий, а затем и проект своей работы, может быть связан только с одним имуществом. Разве это не так? – Jason

+0

Ну вот где, возможно, я ошибаюсь. Например, работник мог работать по нескольким свойствам, то есть 10 Happy Street в понедельник, а затем 20 Silly Street в пятницу ... Работник в этом случае лучше всего подумать о электрике/водопроводчике и т. Д., Так что человек, который мог бы легко работать по одному свойству несколько раз или по нескольким свойствам; однако в любой момент времени они работают только на 1 работу в 1 собственности. Таким образом, вы можете себе представить, что вы хотели бы найти «какие все свойства, с которыми работал Боб?» иметь смысл? – Anthony

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