2012-05-26 3 views
0

Новое в RoR, но у меня есть удар по созданию приложения - и я ищу некоторые советы по моей структуре db.Рекомендации по схеме и ассоциациям базы данных RoR

У меня есть 4 модели/таблицы: Пользователи> Клиенты> Работа> Задачи

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

  1. Пользователи будут войти в
  2. Они могут добавить клиенты
  3. Они могут добавлять Вакансии в Клиенты
  4. Они могут добавлять задачи в рабочие места

Итак, задачи принадлежат заданиям, вакансии принадлежат Клиентам, а Клиенты принадлежат Пользователям.

Я хочу запросить БД для любого из Клиента, Работы или Задачи, а также убедиться, что она принадлежит зарегистрированному в данный момент пользователю. Я изо всех сил пытаюсь написать «рельсовый» запрос на соединение и разработать свои ассоциации, чтобы я мог это сделать.

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

Я читал руководство по телефону http://guides.rubyonrails.org/association_basics.html, но все еще в темноте. Может ли кто-нибудь пролить свет на то, как я могу структурировать свою БД - и, что еще важнее, мои ассоциации?

Thx.

ответ

1

Я не уверен, если я правильно понял ваш вопрос, но я считаю, что это может быть решением:

Если вы пишете свои ассоциации, как это, ActiveRecord создаст автоматически присоединяется, если вы запрашиваете user.jobs или user.tasks.

class User < ActiveRecord::Base 
    has_many :clients 
    has_many :jobs, :through => :clients 
    has_many :tasks, :through => :jobs 
end 

Для получения дополнительной информации см Rails-Api-Documentation

Если вы хотите, чтобы получить все, что для пользователя в одном запросе.Вы можете сделать это:

user.clients.joins(:jobs => :tasks) 
+0

Спасибо за это - на самом деле я создал свои ассоциации. Я предполагаю, что проблема, с которой я столкнулась, связана со второй частью вашего ответа, т.е. спрашивая: 'user.jobs'. Я просто не знаю, как это сделать. Отвечает ли это здесь? : o) – user1418711

+0

На самом деле, я думаю, у меня это есть. Это было очень полезно - спасибо! – user1418711

2

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

class Task < ActiveRecord::Base 
    belongs_to :job 
end 

class Job < ActiveRecord::Base 
    belongs_to :client 
    has_many :tasks 
end 

class Client < ActiveRecord::Base 
    belongs_to :user 
    has_many :jobs 
    has_many :tasks, :through => :jobs 
end 

class User < ActiveRecord::Base 
    has_many :clients 
    has_many :jobs, :through => :clients 
    has_many :tasks, :through => :jobs 
end 

Теперь ActiveRecord будет заботиться о стыки для вас , Это правда, что в чистой схеме db вы не должны иметь user_id более чем в одном месте (здесь это будет таблица клиентов). Однако иногда это также добавляется к таблице задач и рабочих мест для повышения производительности, потому что тогда запросы db не будут такими большими. Тем не менее вы должны приложить больше усилий для согласования своих данных - вы должны убедиться, что задание имеет тот же user_id, что и его клиент, например.

Тогда вы могли бы определить контекстные ассоциации, как:

class Task < ActiveRecord::Base 
    belongs_to :user 
end 

Но в данном случае я бы не сделать это, если вы не заметили, что запросы слишком медленно для ваших нужд. Преждевременная оптимизация есть зло :-)

+0

Спасибо за это. Вот как я установил свои ассоциации - я думаю, моя проблема в том, что я ошибаюсь в этом направлении, и у меня возникают проблемы с запросом к БД. – user1418711