первый вариант, вы создаете клиентскую таблицу и делаете отношения следующим образом:
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