ActiveRecord связывает с двумя разными моделями - PullRequest
0 голосов
/ 21 января 2019

Мне тяжело обдумывать, как я должен настраивать свои таблицы + ассоциации.

У меня есть Lawsuit модель. В иске has_many стороны (ответчики, истцы, адвокаты и т. Д.). Партия, в свою очередь, может быть Person или Company. В конечном итоге я хочу получить:

  • судебные иски человека (@person.lawsuits);
  • судебные иски компании (@company.lawsuits); и
  • Стороны иска (@lawsuit.parties), которые могут быть people или companies.

Вот так у меня настроены мои таблицы + модели:

человек

| id | fname  | lname | date_of_birth |
| -- | ------ | ----- | ------------- |
|  1 | John   | Smith |    1974-02-04 |
|  2 | George | Glass |    1963-07-29 |

компания

| id | name      | duns      | ticker | address      |
| -- | --------- | --------- | ------ | ------------ |
|  1 | Acme Inc. | 239423243 | ACME   | 123 Main St. |

Иски

| id | jurisdiction | court | case_no    | title                       |
| -- | ------------ | ----- | ---------- | --------------------------- |
|  1 |      federal | SDNY  | 18-CV-1234 | Smith v. Glass, Acme, et al |

lawsuit_parties

| id | lawsuit_id | person_id | company_id | role      |
| -- | ---------- | --------- | ---------- | --------- |
|  1 |          1 |         1 |            | plaintiff |
|  2 |          1 |         2 |            | defendant |
|  3 |          1 |           |          1 | defendant |
# models/lawsuit.rb:
class Lawsuit < ApplicationRecord
    has_many :lawsuit_parties

    def parties
        self.lawsuit_parties
    end

    def defendants
        self.parties(where(lawsuit_parties: {role: 'defendant'})
    end

    def plaintiffs
        self.parties(where(lawsuit_parties: {role: 'plaintiff'})
    end

    def attorneys
        self.parties(where(lawsuit_parties: {role: 'attorney'})
    end
end
# models/lawsuit_party.rb
class LawsuitParty < ApplicationRecord
    belongs_to :person
    belongs_to :company
end
# models/person.rb
class Person < ApplicationRecord
    has_many :lawsuit_parties
    has_many :lawsuits, through: :lawsuit_parties
end
# models/company.rb
class Company < ApplicationRecord
    has_many :lawsuit_parties
    has_many :lawsuits, through: :lawsuit_parties
end

Любая помощь, которую вы бы высоко оценили ...

1 Ответ

0 голосов
/ 21 января 2019

Вы на правильном пути, но вам нужно ввести полиморфное отношение в вашу модель соединения, чтобы этот тип моделирования работал. Enum может обрабатывать различия между Ответчиками и Истцами , а также предоставляет несколько областей / методов, которые вы запрашиваете бесплатно.

class LawsuitParty < ApplicationRecord
    belongs_to :lawsuit
    belongs_to :partiable, polymorphic: true

    enum role: [:defendant, :plaintiff]
end

Вам нужно написать миграцию визмените вашу таблицу lawsuit_parties на следующие столбцы (все имена соглашений Rails):

partiable_id   = Integer
partiable_type = String
role           = String

lawsuit_parties

| id | lawsuit_id | partiable_id | partiable_type | role      | 
| -- | ---------- | ------------ | -------------- | ----------|
|  1 |          1 |            1 | Person         | defendant |
|  2 |          1 |            2 | Company        | plaintiff |
|  3 |          1 |            1 | Company        | defendant |

Затем скажите Rails, что записи Person и Company связаны со многими Lawsuit, использующими has_many 's :as опция.

class Person < ApplicationRecord
    has_many :lawsuit_parties, as: :partiable
    has_many :lawsuits, through: :lawsuit_parties
end

Добавьте тот же has_many :lawsuit_parties, as: :partiable в компанию или любые другие модели, которые могут появиться позже (например, Judge или JuryMember).

Как только вы настроите LawsuitParty, как это, у вас все будет готово.

...