Rails: Могу ли я ссылаться на таблицу напрямую и через соединение? - PullRequest
0 голосов
/ 24 декабря 2018

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

Мои модели выглядят следующим образом:

class Task < ApplicationRecord
  belongs_to :project
  delegate :workspace, :to => :project, :allow_nil => true
  belongs_to :person
  belongs_to :importance
  belongs_to :urgency
end

class Person < ApplicationRecord
  belongs_to :company
  has_many :tasks
end

class Company < ApplicationRecord
  has_many :people
end

Я хочу иметь возможность добавить ссылку на свою таблицу задач, которая позволяет мне отслеживать, каким клиентом является конкретная задача.Я мог бы создать новую таблицу с именем client и заполнить ее всеми именами клиентов.Однако, поскольку у меня уже есть таблица компаний, это похоже на дублирование данных.Таким образом, есть ли способ, чтобы я имел ссылку client_id в таблице задач, а также person_id?Я обеспокоен тем, что это вызовет проблемы, особенно в моих контроллерах, когда я выполняю запрос к некоторым данным, поскольку каждая задача будет принадлежать клиенту, а также будет иметь человека, ответственного за задачу, которая, скорее всего, будет принадлежать другой компании.

1 Ответ

0 голосов
/ 24 декабря 2018

первый вариант, вы создаете клиентскую таблицу и делаете отношения следующим образом:

class Task < ApplicationRecord
  belongs_to :project
  delegate :workspace, :to => :project, :allow_nil => true
  belongs_to :person
  belongs_to :client
  belongs_to :importance
  belongs_to :urgency
end


class Person < ApplicationRecord
  belongs_to :company
  has_many :tasks
  has_many :clients , :through => :tasks
end

class Client < ApplicationRecord
  belongs_to :company
  has_many :tasks
  has_many :people , :through => :tasks
end

class Company < ApplicationRecord
  has_many :people
  has_many :clients
end
  • task.client.company = это сгенерирует запрос с client_id
  • task.person.company = это сгенерирует запрос с параметром person_id

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

class Task < ApplicationRecord
  belongs_to :client, foreign_key: "client_id", class_name: "Person"
  belongs_to :person, foreign_key: "person_id", class_name: "Person"
end

class Person < ApplicationRecord
  # as person
    has_many: client_relations, foreign_key: :person_id, class_name: "Task"
    has_many: clients, through: :client_relations, source: :client
  # as client
    has_many: person_relations, foreign_key: :client_id, class_name: "Task"
    has_many: people, through: :person_relations, source: :person
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...